繁体   English   中英

当我在JTable中更改列中的单元格时,如何使用setValueAt

[英]How to use setValueAt, when I change cell in column in JTable

我有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(Unknown Source)at javax.swing.table.AbstractTableModel.fireTableCellUpdated(Unknown Source)at javax.swing.table.DefaultTableModel.setValueAt (未知来源)at javax.swing.JTable.setValueAt(Unknown Source)

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

我的表

您应该更改选定的列和行而不是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);
  }

}

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

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

看起来第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()读取同一行中其他列的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM