无法从JTable更新单元格 [英] Can't update cells from JTable

查看:39
本文介绍了无法从JTable更新单元格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试寻找一种通过直接输入来更新单元格的方法.从我的研究中,每个人似乎都说您必须使用

  myJTable.fireTableCellUpdated() 

尽管如此,它一直要求我转换myJTable->不能将其转换为AbstractTableModel,据我所知,这是必需的.

如果可以的话,这是我当前的表格代码:

  myJTable = new JTable();myJTable.setModel(新的DefaultTableModel(新对象[] [] {{null,null,null},},新的String [] {事物1",事物2",事物3"}));myJTable.getModel().addTableModelListener(new TableModelListener(){公共无效tableChanged(TableModelEvent e){myJTable.fireTableCellUpdated(e.getFirstRow(),e.​​getColumn());myJTable.repaint(tblCG.getCellRect(e.getFirstRow(),e.​​getColumn(),false));myJTable.putClientProperty("terminatedEditOnFocusLost",true);}}); 

我怎么可能保存通过用户直接输入已更新的单元格中的数据?谢谢!

解决方案

根据您要执行的操作,可以使用...

了解更多详情...

I've been trying to find a way to update my cells by direct input. From my reshearch, everyone seems to say that you have to use

myJTable.fireTableCellUpdated()

Althought, it keeps asking me to cast myJTable --> It can't be casted to an AbstractTableModel which is what, from what I understood, is needed.

Here is my current code for the Table if that can helps :

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

How is it possible for me to save the datas from the cell that has been updated by direct input from the user? Thanks !

解决方案

Depending on what you are trying to do, you can use...

For example...

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

}

You should only need to call one of the helper fireXxx event methods if you have customised the class yourself in some way and should ONLY be called from within the classes context, they should not be triggered externally, it's the responsibility of the implementing class to do this

So, with no additional code...

Cell editing is built in by default...

See...

for more details...

这篇关于无法从JTable更新单元格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆