【问题标题】:How to use setValueAt, when I change cell in column in JTable当我在 JTable 中更改列中的单元格时如何使用 setValueAt
【发布时间】:2016-08-01 19:54:43
【问题描述】:

我有带有行和列的 JTable, 当我编辑索引为 4 的列中的任何单元格时,我需要 -> 应该更改同一行中的“VALUE”,但下一列索引为 5。 我有下一个代码,但它不起作用

table.getModel().addTableModelListener(new TableModelListener() {
        public void tableChanged(TableModelEvent e) {
            if (table.getSelectedRow()>=0) {
                try {
                    if (table.getSelectedColumn()==4){
                            
                        table.setValueAt("VALUE", 0, 0);
                    }
                } catch (ArrayIndexOutOfBoundsException ee){
                     ee.printStackTrace();
                }
            }
         }
    });

它有一个错误:

在 MainFrame$3.tableChanged(MainFrame.java:188) 在 javax.swing.table.AbstractTableModel.fireTableChanged(未知来源) 在 javax.swing.table.AbstractTableModel.fireTableCellUpdated(未知 来源)在 javax.swing.table.DefaultTableModel.setValueAt(Unknown 来源)在 javax.swing.JTable.setValueAt(未知来源)

因为它有无限循环。 请帮帮我。

【问题讨论】:

  • 我不明白你的问题。你能编辑得更清楚吗?
  • 为了获得更好的帮助,请尽快发布 MCVE / SSCCE,简短、可运行、可编译,并在局部变量中为 JTable / XxxTableModel 提供硬编码值

标签: java swing jtable listener tablemodel


【解决方案1】:

对我来说,您的错误与您依赖所选列的事实有关,您应该依赖事件本身提供的内容,如下所示:

table.getModel().addTableModelListener(new TableModelListener() {
    public void tableChanged(TableModelEvent e) {
        if (e.getType() == TableModelEvent.UPDATE) {
            final int row = e.getFirstRow();
            final int column = e.getColumn();
            if (column == 4) {
                table.setValueAt("VALUE", row, column + 1);
            }
        }
    }
});

【讨论】:

    【解决方案2】:

    看起来第 5 列依赖于第 4 列。您可以覆盖 setValueAt() 并像这样更新每一行中的下一列:

    @Override
    public void setValueAt(Object object, int row, int col) {
        super.setValueAt(object, row, col);
        int releases = ((Integer) object).intValue();
        int tracksToDownload = releases * …;
        if (col == 4) {
            super.setValueAt(tracksToDownload, row, col + 1);
        }
    }
    

    我不确定您如何计算tracksToDownload,但您可以使用super.getValueAt() 读取同一行中其他列的值。

    【讨论】:

      【解决方案3】:

      您应该更改选定的列和行,而不是table.setValueAt("VALUE", 0, 0)

              table.getModel().addTableModelListener(new TableModelListener() {
              public void tableChanged(TableModelEvent e) {
                  if (table.getSelectedRow()>=0) {
                      try {
                          if (table.getSelectedColumn()==4){
      
                              table.setValueAt("VALUE", table.getSelectedRow(), 5);
                          }
                      } catch (ArrayIndexOutOfBoundsException ee){
                           ee.printStackTrace();
                      }
                  }
               }
          });
      

      或者你可以尝试如下。在此示例中,如果您编辑“D”列,则“E”列将更新为“VALUE”。

      import javax.swing.JFrame;
      import javax.swing.JScrollPane;
      import javax.swing.JTable;
      import javax.swing.ListSelectionModel;
      import javax.swing.event.ListSelectionEvent;
      import javax.swing.event.ListSelectionListener;
      
      public class JTableListSelectionListener {
      
        public static void main(String[] a) {
          JFrame frame = new JFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
          final JTable table;
      
          String[] columnTitles = { "A", "B", "C", "D", "E" };
          Object[][] rowData = { { "11", "12", "13", "14", "" }, { "21", "22", "23", "24", "" },
              { "31", "32", "33", "34", "" }, { "41", "42", "44", "44", "" } };
      
          table = new JTable(rowData, columnTitles);
      
          table.setCellSelectionEnabled(true);
          ListSelectionModel cellSelectionModel = table.getSelectionModel();
          cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      
          cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
      
              if(e.getValueIsAdjusting()) {
                  return;
              }
      
              String selectedData = null;
      
              int[] selectedRows = table.getSelectedRows();
              int[] selectedColumns = table.getSelectedColumns();
      
      
              int selectedCol = -1;
              int selectedRow = -1;
              for (int i = 0; i < selectedRows.length; i++) {
                for (int j = 0; j < selectedColumns.length; j++) {
                  selectedData = (String) table.getValueAt(selectedRows[i], selectedColumns[j]);
                  selectedCol = selectedColumns[j];
                  selectedRow = selectedRows[i];
                }
              }
      
              if(selectedCol == 3) {
                  table.setValueAt("VALUE", selectedRow, selectedCol+1);
              }
      
              System.out.println("Selected: " + selectedData);
            }
      
          });
      
          frame.add(new JScrollPane(table));
      
          frame.setSize(300, 200);
          frame.setVisible(true);
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-04
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 2011-08-13
        • 2011-07-01
        相关资源
        最近更新 更多