[英]How to force jTable to be not editable?
我所知道的,從理論上講,您可以通過創建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);
}
}
首先,不要在模型中創建UI元素。
其次,不要從事件調度線程之外創建UI元素
第三(如古巴人所指出的),您尚未將模型應用於表格...
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);
}
});
}
古巴着火了...
第四,以下將使您的程序崩潰。 這些方法由表調用,以便它顯示如何配置自身。
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);
}
您應該引用您要建模的內部數據結構。
您可能會發現通讀如何使用表格會有所幫助
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
row, setValueAt(...)
)無法存儲從JTables
視圖到AbstractTableModel
任何更改
想念那里ColumnClass
JTable
視圖的所有數據都存儲在XxxTableModel
API中已實現方法的非常正確的AbstractTableModel
( Object[]
/ Double[]
/ String[]
...和Vector<Object>
/ Vector<String>
...)
您在這里遇到幾個問題:
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];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.