【问题标题】:how to update AbstractTableModel如何更新 AbstractTableModel
【发布时间】:2012-11-22 03:58:51
【问题描述】:

我参考了一些方法。 即fireTableCellUpdated的有效方式。 但其实我还是不申请。

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

我称之为GJJ方法实现的方法。 虽然更新了但是出现了很多新的窗口。 这不是我的需要。

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

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

        }
    });

}

【问题讨论】:

    标签: java swing jtable updates abstracttablemodel


    【解决方案1】:

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

    我已经做了一个简单的例子。

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

    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 以了解更多信息

    【讨论】:

    • 我的意思是我有一个价值。按下按钮,值会更新,表格也会更新。
    • 所以,您可以直接调用Table#setValueAt(Object, int, int),这将更新模型(假设您已在模型中覆盖setValueAt)并更新视图
    • 怎么能简单的演示给我看?创建一个新类 HG();类 HG 扩展 AbstractTableModel { Object getValueAt (int row, int col) { return p [row] [col]; } } 失败。
    • 我已更新示例以包含“更新”按钮。选择一行,点击更新,瞧...
    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多