java - 如何更新 AbstractTableModel

标签 java swing jtable updates abstracttablemodel

我引用了很多方法。 即fireTableCellUpdated的有效方法。 但事实上我还是不申请。

如何让DETA值更新后表格内容也更新。

该方法我调用GJJ方法实现。 虽然更新了但是出现了很多新的窗口。 这不是我的需求。

告诉我如何在新窗口中添加按钮和监听按钮来执行更新行为 friend 告诉我怎么做。

         class MyTable extends AbstractTableModel {

    Object p[][]={  
                {DETA_1_1,DETA_1_2, DETA_1_3, DETA_1_4, DETA_1_5},
                {DETA_2_1,DETA_2_2, DETA_2_3, DETA_2_4, DETA_2_5},
                {DETA_3_1,DETA_3_2, DETA_3_3, DETA_3_4, DETA_3_5},
                {DETA_4_1,DETA_4_2, DETA_4_3, DETA_4_4, DETA_4_5},
                {DETA_5_1,DETA_5_2, DETA_5_3, DETA_5_4, DETA_5_5},
                {DETA_6_1,DETA_6_2, DETA_6_3, DETA_6_4, DETA_6_5},
                {DETA_7_1,DETA_7_2, DETA_7_3, DETA_7_4, DETA_7_5},
                {DETA_8_1,DETA_8_2, DETA_8_3, DETA_8_4, DETA_8_5},  
                {DETA_9_1,DETA_9_2,DETA_9_3,DETA_9_4,DETA_9_5},  
                {DETA_10_1,DETA_10_2,DETA_10_3,DETA_10_4,DETA_10_5},  
                {DETA_11_1,DETA_11_2,DETA_11_3,DETA_11_4,DETA_11_5},  
                {DETA_12_1,DETA_12_2,DETA_12_3,DETA_12_4,DETA_12_5},  
                {DETA_1_3_1,DETA_1_3_2,DETA_1_3_3,DETA_1_3_4,DETA_1_3_5},  
                {DETA_1_4_1,DETA_1_4_2, DETA_1_4_3, DETA_1_4_4, DETA_1_4_5},  
                {DETA_15_1,DETA_15_2,DETA_15_3,DETA_15_4,DETA_15_5},  
                {DETA_16_1,DETA_16_2,DETA_16_3,DETA_16_4,DETA_16_5},  
                {DETA_17_1,DETA_17_2,DETA_17_3,DETA_17_4,DETA_17_5},  
                {DETA_1_8_1,DETA_1_8_2,DETA_1_8_3,DETA_1_8_4,DETA_1_8_5},  
                {DETA_19_1,DETA_19_2,DETA_19_3,DETA_19_4,DETA_19_5}  
            };  
    String[] n = { "NO","CARD","NAME","NAME2","time" };

    public int getColumnCount() {
        return n.length;
    }

    public int getRowCount() {
        return p.length;
    }

    public String getColumnName(int col) {
        return n[col];
    }

    public Object getValueAt(int row, int col) {
        return p[row][col];
    }

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

}

   private void GJJ() {
    JFrame f = new JFrame();
    MyTable mt = new MyTable();
    JTable t = new JTable(mt);

    t.setPreferredScrollableViewportSize(new Dimension(550, 30));
    JScrollPane s = new JScrollPane(t);
    f.getContentPane().add(s, BorderLayout.CENTER);
    f.setTitle("coolman");
    f.pack();
    f.setVisible(true);
    f.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);

        }
    });

}

最佳答案

你的问题有点模糊。 “更新”表模型可以是更新现有模型(即编辑数据)和/或添加新行。

我已经做了一个关于两者的简单示例。

编辑行时,模型和表将自行更新,因此您无需执行任何操作,但是,如果添加或删除行,您将负责自行触发更新事件。

public class TestTableModel {

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

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

                final MyTableModel tableModel = new MyTableModel();
                final JTable table = new JTable(tableModel);

                JButton addButton = new JButton("Add");
                addButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        tableModel.add();
                    }
                });
                JButton updateButton = new JButton("Update");
                updateButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        int row = table.getSelectedRow();
                        if (row > -1) {
                            table.setValueAt("Banana", row, 0);
                        }
                    }
                });

                JPanel buttonPane = new JPanel();
                buttonPane.add(addButton);
                buttonPane.add(updateButton);

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.add(buttonPane, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class Person {

        private String name;
        private int age;

        public Person() {
        }

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public int getAge() {
            return age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setAge(int age) {
            this.age = age;
        }

    }

    public class MyTableModel extends AbstractTableModel {

        private List<Person> lstPeople;

        public MyTableModel() {
            lstPeople = new ArrayList<Person>(25);
            lstPeople.add(new Person("Darryl Garton", randomAge()));
            lstPeople.add(new Person("Neil Willison", randomAge()));
            lstPeople.add(new Person("Darryl Hege", randomAge()));
            lstPeople.add(new Person("Karina Jerry", randomAge()));
            lstPeople.add(new Person("Erik Leddy", randomAge()));
            lstPeople.add(new Person("Chandra Kehrer", randomAge()));
            lstPeople.add(new Person("Katy Sapien", randomAge()));
            lstPeople.add(new Person("Lonnie Blakes", randomAge()));
            lstPeople.add(new Person("Kelly Ruocco", randomAge()));
            lstPeople.add(new Person("Fernando Mckinnie", randomAge()));
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }

        protected int randomAge() {

            return (int)Math.round(Math.random() * 99) + 1;

        }

        @Override
        public int getRowCount() {
            return lstPeople.size();
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public String getColumnName(int column) {
            String name = null;
            switch (column) {
                case 0:
                    name = "Name";
                    break;
                case 1:
                    name = "Age";
                    break;
            }
            return name;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            Class clazz = String.class;
            switch (columnIndex) {
                case 1:
                    clazz = Integer.class;
                    break;
            }
            return clazz;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Object value = null;
            Person person = lstPeople.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    value = person.getName();
                    break;
                case 1:
                    value = person.getAge();
                    break;
            }
            return value;
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            Person person = lstPeople.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    if (aValue instanceof String) {
                        person.setName(aValue.toString());
                    }
                    break;
                case 1:
                    if (aValue instanceof Integer) {
                        person.setAge((Integer)aValue);
                    }
                    break;
            }
            fireTableCellUpdated(rowIndex, columnIndex);
        }

        public void add() {

            lstPeople.add(new Person());
            fireTableRowsInserted(lstPeople.size() - 1, lstPeople.size() - 1);

        }

    }

}

您可能想通读How to use tables了解更多信息

关于java - 如何更新 AbstractTableModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13505690/

相关文章:

java - 如何增加tomcat中的最大堆大小? catalina.sh 有很多引用资料

java - Spring - 具有 hibernate 数据库插入功能的 mvc(SimpleFormController)

java - JFrame 背景图像不起作用

java - 通过编辑单元格更新数据库不起作用?

java - 如果我将结果集传递给表模型,如何在 MyTableModel 中使用 setValueAt()

java - 无法提交 Hibernate 事务

java - 获取 Facebook 用户公共(public)数据,无需通过 Facebook Graph API 登录即可获取这些数据(如果存在)

java - 使用 JFileChooser() 和 JButton() 重命名文件/目录

java - 在 JFrame 中排列多个面板时出错

swing - 使用表格单元格标题颜色自定义 jtable 单元格渲染器