修改JTable中的整个列

时间:2014-03-04 10:02:57

标签: java swing jtable mouselistener listselectionlistener

我有一个JTable,它是通过从文本文件导入数据而形成的。它是一个巨大的表,有大约522列和数千行。此表中的许多单元格也是空的。 现在,我希望能够对某些列中可用的数据应用一些数学运算。所以现在,我可以选择多个列,但我不知道如何获取这些值。我知道我需要一个数组数组,我可以存储表列中的值,然后根据我的算法修改每个值。 现在,简单地开始它,我只是希望能够打印出选择列中的值(只有一个以保持简单)但我不能这样做,我得到一个特定单元格的值打印2-4倍。我的测试代码如下: 对于选择整列,我使用此代码:

public static void selectWholeColumn(final JTable table)
{
 final JTableHeader header = table.getTableHeader(); 
 header.addMouseListener(new MouseAdapter() 
 {  
        public void mouseClicked(MouseEvent e) 
        {  
            int col = header.columnAtPoint(e.getPoint());   
            if(header.getCursor().getType() == Cursor.E_RESIZE_CURSOR) 
            {
                e.consume();  
            }
            else 
            {   
                table.setColumnSelectionAllowed(true);
                table.setRowSelectionAllowed(false);
                table.clearSelection();
                table.setColumnSelectionInterval(col,col);
                table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);                  

            }  
        } 

    }); 

} 

在我的GUI中,我有一个按钮,当点击它时会触发一个后端类,并且执行这个以JTable作为参数的方法来打印出所选列中所有行的值:

public void filterData(final JTable table)
{
    TableModel model = table.getModel();
     table.setCellSelectionEnabled(true);
    table.setColumnSelectionAllowed(true);
    table.setRowSelectionAllowed(false);
        ListSelectionModel cellSelectionModel = table.getSelectionModel();
        cellSelectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        cellSelectionModel.addListSelectionListener(new ListSelectionListener() 
        {
          public void valueChanged(ListSelectionEvent e)
          {
            String selectedData = null;

            int[] selectedRow = table.getSelectedRows();
            int[] selectedColumns = table.getSelectedColumns();

            for (int i = 0; i < selectedColumns.length; i++) 
            {
              for (int j = 0; j < selectedRow.length; j++) 
              {
                selectedData = (String) table.getValueAt(selectedRow[i], selectedColumns[j]);
              }
            }
            System.out.println("Selected: " + selectedData);
          }

        });

有关如何打印或基本上获取所选列或列中所有行的值的任何建议,以便我可以立即修改其中的数据?

谢谢!

1 个答案:

答案 0 :(得分:2)

尽管在TableModel中使用getValueAt()并在ListSelectionListener中使用StringBuilder循环是一种合理的方法,但是会为每次更改调用侦听器。目前还不清楚你遇到麻烦的地方;你可以

  • 使用List<String>连接选定的值。

  • TableModel

  • 中累计所选值
  • 使用Set<Integer>保持ItemHandler中的选择,如here所示。

  • TableCellRenderer的{​​{1}}选择操作,如图here所示。