我知道理论上你可以通过创建一个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);
}
}
答案 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);
}
单独的视图和模型逻辑
(缺少add
,remove
行,setValueAt(...)
)无法存储从JTables
视图到{{1}的任何更改}}
错过AbstractTableModel
ColumnClass
视图的所有数据都存储在JTable
quite correct AbstractTableModel
了解API中的已实施方法(XxxTableModel
/ Object[]
/ Double[]
...和String[]
/ Vector<Object>
。 ..)
答案 2 :(得分:2)
这里有几个问题:
StackOverflowError
,因为当您调用table.getRowCount()
时,它会调用getModel().getRowCount()
。这是基于您的代码的可运行且可行的解决方案:
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];
}
}