如何强制jTable不可编辑?

时间:2012-11-09 08:18:35

标签: java swing jtable

我知道理论上你可以通过创建一个AbstractTableModel来强制jTable不可编辑,并通过始终始终返回false来覆盖以下方法(尽管这是不必要的,因为事实上默认方法是AbstractTableModel已经返回false)。

@Override
public boolean isCellEditable(int row, int column) {
   return false;
}

似乎我仍然无法弄清楚如何使这项工作适合我的代码。我究竟做错了什么?这是我的代码:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Datagrid extends AbstractTableModel {
    private static final long serialVersionUID = -1080095595481949205L;
    private String[] title;
    private String[][] data;
    private JTable table;
    private JFrame frm;

    public Datagrid(String[] title, String[][] data) {
        this.title = title;
        this.data = data;

        create_table();
    }

    public JTable getTable() {
        return table;
    }

    private void create_table() {
        table = new JTable(data, title);

        frm = new JFrame();
        frm.getContentPane().add(new JScrollPane(table));
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.pack();
        frm.setVisible(true);
    }

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

    @Override
    public int getColumnCount() {
        return table.getColumnCount();
    }

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

    @Override
    public Object getValueAt(int row, int column) {
        return table.getValueAt(row, column);
    }

}

3 个答案:

答案 0 :(得分:3)

首先,不要在模型中创建UI元素......

其次,不要在Event Dispatching Thread

的外面创建UI元素

第三(正如cubanacan指出的那样),你没有将模型应用到表格中......

public static void main(String args[]) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            TableModel model = new Datagrid(); // <-- Create a new instance of the model
            table = new JTable(model);         // <-- Apply it to the table..

            frm = new JFrame();
            frm.getContentPane().add(new JScrollPane(table));
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.pack();
            frm.setVisible(true);
        }
    });
}

cubanacan着火了......

第四,以下内容将导致程序崩溃。表格调用了这些方法,以便了解如何配置自身。

public int getColumnCount() {
    return table.getColumnCount();
}

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

@Override
public Object getValueAt(int row, int column) {
    return table.getValueAt(row, column);
}

您应该引用您尝试建模的内部数据结构。

您可能会发现阅读How to Use Tables

会有所帮助

答案 1 :(得分:2)

  • 不是isCellEditable的答案,要从AbstractTableModel
  • 中删除

public JTable getTable() {
    return table;
}

private void create_table() {
    table = new JTable(data, title);

    frm = new JFrame();
    frm.getContentPane().add(new JScrollPane(table));
    frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frm.pack();
    frm.setVisible(true);
}
  • 单独的视图和模型逻辑

  • 此表单中的
  • (缺少addremove行,setValueAt(...))无法存储从JTables视图到{{1}的任何更改}}

  • 错过AbstractTableModel

  • ColumnClass视图的所有数据都存储在JTable

  • quite correct AbstractTableModel了解API中的已实施方法(XxxTableModel / Object[] / Double[] ...和String[] / Vector<Object>。 ..)

答案 2 :(得分:2)

这里有几个问题:

  1. 您尚未将表模型设置为JTable。
  2. 如果您设置了表格模型,则会获得StackOverflowError,因为当您调用table.getRowCount()时,它会调用getModel().getRowCount()
  3. 如果设置表模型,则不会在构造函数中指定列标题。有关详细信息,请查看方法AbstractTableModel#getColumnName(int)的javadoc。
  4. 这是基于您的代码的可运行且可行的解决方案:

    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    
    public class Datagrid extends AbstractTableModel {
        private static final long serialVersionUID = -1080095595481949205L;
        private String[] title;
        private String[][] data;
        private JTable table;
        private JFrame frm;
    
        public Datagrid(String[] title, String[][] data) {
            this.title = title;
            this.data = data;
    
            create_table();
        }
    
        public static void main(String[] args) {
            String[] columnTitles = {"Title 1", "Title 2"};
            String[][] tableData = {{"Value 1", "Value 2"}, {"Another Value 1", "Another Value 2"}};
            new Datagrid(columnTitles, tableData);
        }
    
        public JTable getTable() {
            return table;
        }
    
        private void create_table() {
            table = new JTable(data, title);
            table.setModel(this);
            frm = new JFrame();
            frm.getContentPane().add(new JScrollPane(table));
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.pack();
            frm.setVisible(true);
        }
    
        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }
    
        @Override
        public int getColumnCount() {
            return title.length;
        }
    
        @Override
        public int getRowCount() {
            return data.length;
        }
    
        @Override
        public Object getValueAt(int row, int column) {
            return data[row][column];
        }
    
        @Override
        public String getColumnName(int column) {
            return title[column];
        }
    
    }