通过列名或表头查找列号 - JTable

7
我希望能够为不同表单中的jtables实现一个通用的验证类,以检查qty列,因为不同表格中的qty列编号是不同的。为此,我想要通过列名获取列值,就像在C#或VB中一样。
我的要求如下。
 int qty=jtable.getValueAt(rowNo,"columnName");

现在我正在使用

 int qty=jtable.getValueAt(rowNo,colNo);

有没有办法通过JTable的列名或表头来找到列号?
5个回答

11

你应该尝试使用这个:

int qty = jtable.getValueAt( rowNo, jtable.getColumn("columnName").getModelIndex() );

列名大小写敏感吗? - nikli
在调用JTable.getValueAt时,需要使用视图索引而不是模型索引。 - TT.

6

你应该询问TableModel而非JTable,因为后者可能会重新排列其列。一种方法是让你的TableModel实现一个合适的接口,例如:

public interface Quantifiable {
    public int getQuantity(int row);
}

补充: 请告诉我如何实现这个接口
在您现有的TableModel类之间的关系上很多内容取决于。比方说,它们所有都在某些列中具有数字数量。如果quantityCol是模型索引类型为Number的列,您可以像这样做:
public class QuantifiableTableModel
        extends AbstractTableModel implements Quantifiable {

    private int quantityCol;

    public QuantifiableTableModel(int quantityCol) {
        this.quantityCol = quantityCol;
    }

    @Override
    public int getQuantity(int row) {
        Number n = (Number) getValueAt(row, quantityCol);
        return n.intValue();
    }
    ...
}

请告诉如何实现这个接口。 - Syed Muhammad Mubashir
抱歉,我的要求很简单,就是使用jtable.getValueAt(rowNo,"columnName")这样的方式。因为你在问题中提到了QuantifiableTableModel类的构造函数QuantifiableTableModel(int quantityCol),但我不知道列号是多少。在问题中,我只是提到了验证作为问题的用例,而没有提到问题本身。我以为你不理解我的问题。@trashgod - Syed Muhammad Mubashir
还要考虑实现Iterable,它“允许对象成为“foreach”语句的目标”。 - trashgod

2

你好,这是对你的问题的简单回答:

int qty=jtable.getValueAt(rowNo,jtable.convertColumnIndexToView(jtable.getColumn("columnName").getModelIndex()));

2
我遇到了同样的问题。这是我的实现方式:
int nameColNo = getColumnIndex(table, "Name");
String name = (String)table.getValueAt(rowNo, nameColNo);

private int getColumnIndex (JTable table, String header) {
    for (int i=0; i < table.getColumnCount(); i++) {
        if (table.getColumnName(i).equals(header)) return i;
    }
    return -1;
}

当然,如果是您创建了表头,则不应该返回-1,否则您可能会相应地进行处理。


1

我在我的代码中使用了三元运算符完成了我的任务。

 int colNo = ((tbl.getModel().getColumnName(tcl.getColumn()).equalsIgnoreCase("Qty"))
||  (tbl.getModel().getColumnName(tcl.getColumn()).equalsIgnoreCase("Weight"))
|| (tbl.getModel().getColumnName(tcl.getColumn()).equalsIgnoreCase("Wt"))
 ? tcl.getColumn() : -1);

使用Bob Camick的表格单元格编辑器,这是我通用表格单元格监听器的完整代码!

final JTable table = (JTable) jComp.get(a);
tbl.getTableHeader().setReorderingAllowed(false); 

 Action actionProd = new AbstractAction() {

    public void actionPerformed(ActionEvent e) {

        Utility util = new Utility("GoldNew");

        TableCellListener tcl = (TableCellListener) e.getSource();
        System.out.println("Row   : " + tcl.getRow());
        System.out.println("Column: " + tcl.getColumn());
        System.out.println("Old   : " + tcl.getOldValue());
        System.out.println("New   : " + tcl.getNewValue());
        int colNo = ((table.getModel().getColumnName(tcl.getColumn()).equalsIgnoreCase("Qty"))
                || (table.getModel().getColumnName(tcl.getColumn()).equalsIgnoreCase("Weight"))
                || (table.getModel().getColumnName(tcl.getColumn()).equalsIgnoreCase("Wt"))
                ? tcl.getColumn() : -1);

        if (tcl.getColumn() == colNo) {
            int wt = 0;
            Object qtyO = tcl.getNewValue();
            try {
                qtyO = tcl.getNewValue();
                if (qtyO != null) {
                    wt = Integer.parseInt(qtyO.toString());
                }

                if (wt < 0) {
                    table.getModel().setValueAt(tcl.getOldValue(), tcl.getRow(), colNo);
                }

            } catch (Exception ex) {
                util.ShowMessage("Please enter the Numbers only", "Error!");
                table.getModel().setValueAt(tcl.getOldValue(), tcl.getRow(), colNo);
                ex.printStackTrace();
            }




        }

    }
};
TableCellListener tclProd = new TableCellListener(table, actionProd);       

哎呀,这是一个丑陋的解决方案。至少使用一个常规循环来遍历列。JTable提供了所有这些信息。但最好遵循@trashgod的查询模型的方法。当您的JTable中的列或行顺序与模型中的顺序不同时(这是JTable的标准功能),您的代码将无法按预期工作。 - Robin
实际上,名字是Rob Camickr而不是Bob Camickr :-) 顺便说一句,“名字有什么关系”,正如莎士比亚所说,引用他的名字。 - nIcE cOw
@Robin 我已经测试了我的解决方案,对我来说它是有效的,因为我在我的应用程序中主要使用表格模型。 - Syed Muhammad Mubashir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接