【问题标题】:Java: How to insert rows(data) into JTable explicitly if rows are inserted by AbstractTableModelJava:如果由 AbstractTableModel 插入行,如何将行(数据)显式插入 JTable
【发布时间】:2012-03-30 15:38:12
【问题描述】:

在我的应用程序中有一个 JTable,我想在创建表后插入行。

以下所有代码都在框架的构造函数中。

代码:

private TableModel model = new AbstractTableModel(){
String[] columnNames = {"First Name","Last Name","Sport","# of Years","Vegetarian"};
private Object[][] data = {};

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

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

            public String getColumnName(int col) {
                return columnNames[col];
            }
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }

            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
            public boolean isCellEditable(int row, int col) {
                retuen false;
            }
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
};

table = new JTable(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);

JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(5, 218, 884, 194);
//now adding this to the frame where I want to show 
frame.add(scrollPane);

现在我想在表中插入行或数据。这怎么可能。 以前我使用 DefaultTableModel 但我们不能在 DefaultTableModel 中使用 isCellEditable 和其他方法,所以我用上面的代码更改了它。但是在上面的代码中我无法显式插入数据(行),请帮助我。

【问题讨论】:

    标签: java swing jtable abstracttablemodel


    【解决方案1】:

    这样,您可以实现其他方法,如 deleteRow(int rowIndex) 和 insertRowToIndex(int rowIndex, List rowData)。

    记住更改数据后,必须触发表格事件,例如 fireTableRowsInserted() 等

    public static class MyTableModel extends AbstractTableModel
    {
        private List<String> columnNames = new ArrayList();
        private List<List> data = new ArrayList();
    
        {
            columnNames.add("First Name");
            columnNames.add("Last Name");
            columnNames.add("Sport");
            columnNames.add("# of Years");
            columnNames.add("Vegetarian");
        }
    
        public void addRow(List rowData)
        {
            data.add(rowData);
            fireTableRowsInserted(data.size() - 1, data.size() - 1);
        }
    
        public int getColumnCount()
        {
            return columnNames.size();
        }
    
        public int getRowCount()
        {
            return data.size();
        }
    
        public String getColumnName(int col)
        {
            try
            {
                return columnNames.get(col);
            }
            catch(Exception e)
            {
                return null;
            }
        }
    
        public Object getValueAt(int row, int col)
        {
            return data.get(row).get(col);
        }
    
        public boolean isCellEditable(int row, int col)
        {
            return false;
        }
    
        public Class getColumnClass(int c)
        {
            return getValueAt(0, c).getClass();
        }
    };
    
    public static void main(String[] args)
    {
        MyTableModel model = new MyTableModel();
    
        model.addRow(Arrays.asList("yi", "chen", "sleep", 35, true));
    
        JTable table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
    
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBounds(5, 218, 884, 194);
        //now adding this to the frame where I want to show 
        JFrame frame = new JFrame();
        frame.add(scrollPane);
        frame.setVisible(true);
    }
    

    【讨论】:

    • ok ...如果我想在应用程序的其他方法中添加行,那么代码是什么?
    • +1 用于为自定义 api 扩展 AbstractTableModel。但是:在匿名课程中这样做没有多大意义..这可能是@VinitVikash 的绊脚石:-)
    【解决方案2】:

    AbstractTableModel 不会做你想做的事,为此你需要使用 DefaultTableModel,

    当您使用 DefaultTableModel 时,您可以通过以下方式设置 isCellEditable 或任何其他方法,

        DefaultTableModel model = new DefaultTableModel(data, columnNames) {
            private static final long serialVersionUID = 1L;
    
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }       
        };
    

    在上面的代码中,数据将是 String[ ][ ]。通过编写上面的代码,您将单元格可编辑设置为 false。

    除此之外,您还可以像以前那样在 swingworker 或后记中加载数据。

    【讨论】:

    • 你需要使用 DefaultTableModel 不一定:扩展 AbstractXX 并添加 api 也可以:-)
    【解决方案3】:

    @Peter 是正确的 +1 使用 DefaultTableModel 而不是 AbstractTableModel,因为您的 AbstractTableModel 错过了方法 addRow();(以及其他方法)

    public void addRow(Object[][] data) {
        this.data.add(data);
        this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
    }
    

    关于AbstractTableModel的例子

    【讨论】:

      【解决方案4】:

      DefaultTableModel 扩展而不是从AbstractTableModel 扩展应该可以解决问题。

      【讨论】:

      • 但是如果我使用 DefaultTableModel 那么我将无法在我的表中使用 isCellEditable 和其他方法,这就是我将 DefaultTableModel 更改为 AbstractTableModel 的原因。
      【解决方案5】:

      我认为您需要在 AbstractTableModel 中实现 setValueAt() 函数,以便您可以修改给定位置的任何数据。

      仔细查看以下教程:

      http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm

      http://www.informit.com/articles/article.aspx?p=332278

      【讨论】:

      • 我不想编辑数据。我想插入数据或行。
      猜你喜欢
      • 1970-01-01
      • 2012-01-07
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多