Java Can';t从JTable更新单元格

Java Can';t从JTable更新单元格,java,jtable,Java,Jtable,我一直在想办法通过直接输入来更新我的单元格。从我看来,每个人似乎都说你必须使用 myJTable.fireTableCellUpdated() 尽管如此,它一直要求我转换myJTable-->它不能转换为AbstractTableModel,根据我的理解,这是需要的 以下是我当前的表格代码(如果有帮助): myJTable= new JTable(); myJTable.setModel(new DefaultTableModel( new Object[][

我一直在想办法通过直接输入来更新我的单元格。从我看来,每个人似乎都说你必须使用

myJTable.fireTableCellUpdated()
尽管如此,它一直要求我转换myJTable-->它不能转换为AbstractTableModel,根据我的理解,这是需要的

以下是我当前的表格代码(如果有帮助):

    myJTable= new JTable();

    myJTable.setModel(new DefaultTableModel(
        new Object[][] {
            {null, null, null},
        },
        new String[] {
            "Thing#1", "Thing#2", "Thing#3"
        }
    ));

    myJTable.getModel().addTableModelListener(new TableModelListener() { 
         public void tableChanged(TableModelEvent e) { 
             myJTable.fireTableCellUpdated(e.getFirstRow(), e.getColumn());
             myJTable.repaint(tblCG.getCellRect(e.getFirstRow(), e.getColumn(), false));
             myJTable.putClientProperty("terminatedEditOnFocusLost", true);
         } 
         });
我如何能够保存通过用户直接输入更新的单元格中的数据?
谢谢

根据您要做的事情,您可以使用

  • 或修改现有单元格的行/列值。请注意,根据当前排序顺序和列位置,模型和视图可能具有不同的索引
  • 您可以使用添加新行和
  • 您可以使用删除它们。请记住,索引值必须在模型上下文中,如果从表/视图中获取原始值,则必须首先将其转换为模型上下文
例如

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    private JTable myJTable;

    private String values[] = {"Orange", "Green", "Blue", "Pink", "Yellow"};
    private int count;

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                myJTable = new JTable();

                myJTable.setModel(new DefaultTableModel(
                                new Object[][]{{"Banana", "Yellow"}},
                                new Object[]{"Fruit", "Color"}
                ));

                JButton change = new JButton("Change");
                change.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        count++;
                        String value = values[Math.abs(count % values.length)];
                        myJTable.setValueAt(value, 0, 1);
                    }

                });
                JButton add = new JButton("add");
                add.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        DefaultTableModel model = (DefaultTableModel) myJTable.getModel();
                        model.addRow(new Object[]{"Apple " + model.getRowCount(), "Green"});
                    }

                });
                JButton delete = new JButton("delete");
                delete.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        int rowIndex = myJTable.getSelectedRow();
                        rowIndex = myJTable.convertRowIndexToModel(rowIndex);
                        if (rowIndex > 0) {
                            DefaultTableModel model = (DefaultTableModel) myJTable.getModel();
                            model.removeRow(rowIndex);
                        }
                    }

                });

                JPanel actions = new JPanel();
                actions.add(change);
                actions.add(add);
                actions.add(delete);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(myJTable));
                frame.add(actions, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

如果您自己以某种方式自定义了类,并且只应从类上下文中调用,则只需调用一个helper
fireXxx
事件方法,它们不应在外部触发,这是实现类的责任

所以,没有额外的代码

默认情况下,单元编辑是内置的

欲了解更多详情…

以下是我的建议(希望我正确理解问题):

  • 我将把传递给
    DefaultListModel
    的数据字段声明为类属性。然后可以通过这些属性访问表中的对象

  • 我将重写隐式构造函数中的
    DefaultTableModel#setValueAt(Object,int,int)
    DefaultTableModel#getValueAt(int,int)

  • 因此,请尝试以下解决方案:

    //declared as class attributes
    Object[][] data = {{null, null, null},};
    String[] columns = {"Thing#1", "Thing#2", "Thing#3"};
    
    /*...*/
    
    table.setModel(new DefaultTableModel(data, columns) {
        @Override
        public Object getValueAt(int row, int col) { return data[row][col]; }
        @Override
        public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }
    }); 
    

    希望这能帮助…

    myJTable.fireTableCellUpdated()
    -不,永远不会!您应该能够简单地使用
    JTable#setValueAt
    TableModel#setValueAt
    ,如果
    TableModel
    配置正确,它应该自动通知表。永远不要从类外调用事件激发方法context@MadProgrammer好的,如果我遵循您的逻辑,我应该做:
    myJTable.setValueAt(?getCellValue??,e.getFirstRow(),e.getColumn())感谢您的支持!。当我点击图像中的“D3788”时,我应该能够将其编辑为任何其他内容<代码>Table.getModel().addTableModelListener(新建TableModelListener(){public void tableChanged(TableModelEvent e){if(!construction){Table.setValueAt(Table.getModel().getValueAt(e.getFirstRow(),e.getColumn()),e.getFirstRow(),e.getColumn());Table.repaint(Table.getCellRect(e.getFirstRow(),e.getColumn(),false));Table.putClientProperty(“terminatedEditOnFocusLost”,true);}}很抱歉可见性差,评论太少。代码是表的代码。构造是一个布尔值,只是为了确保我不听取程序输入。当这段代码被执行时,我得到一个看起来像无限循环的崩溃。它在工作什么?默认的
    TableCellEditor
    应该会自动处理它……嗯,我想我只是想得太多了。给我5分钟,我会尝试一些东西来保存我的数据。谢谢你的帮助!