【问题标题】:Find column # by column name or header - JTable按列名或标题查找列# - JTable
【发布时间】:2012-11-08 02:37:12
【问题描述】:

我想为我的 jtables 以不同的形式实现一个通用的验证类来检查 qty 列,因为不同形式的不同表中的 qty 列 No 是不同的。为此,我想在 C# 或 VB 中类似地按列名称获取列值。

我的要求如下。

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

现在我正在使用

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

有什么方法可以通过 JTable 的列名或表头找到列#?

【问题讨论】:

    标签: java swing jtable tablecolumn


    【解决方案1】:

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

    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,否则你可以相应地对待它。

      【讨论】:

        【解决方案3】:

        你应该尝试使用这个:

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

        【讨论】:

        • 列名是否区分大小写?
        • 在调用JTable.getValueAt 时需要视图索引,不是模型索引。
        【解决方案4】:

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

         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's Table Cell Editor)的通用表格单元侦听器的完整代码!

        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);       
        

        【讨论】:

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

        您可能应该询问TableModel,而不是JTable,后者的列可能已重新排列。一种方法是让您的TableModel 实现一个合适的接口,例如,

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

        附录:请告诉如何实现这个接口

        很大程度上取决于您现有的TableModel 类之间的关系。假设 allsome 列中有一个数字量。如果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();
            }
            ...
        }
        

        【讨论】:

        • 请告诉如何实现这个接口
        • 对不起,我的要求只是 jtable.getValueAt(rowNo,"columnName") 因为在你的问题中你已经给出了类 QuantifiableTableModel(int quantityCol) 的构造函数,但我不知道列号。问题我只提到验证作为问题的用例,而不是问题本身。我以为你不明白我的问题。 @trashgod
        • 还可以考虑实现Iterable,它“允许一个对象成为“foreach”语句的目标。”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 2013-10-04
        相关资源
        最近更新 更多