![](/img/trans.png)
[英]JTable will set to editable after converting ResultSet to TableModel with DbUtils. How to make it non-editable again?
[英]Non editable JTable with existing TableModel
我知道我可以通過覆蓋isCellEditable()函數使JTable不可編輯:
DefaultTableModel tableModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
//all cells false
return false;
}
};
table.setModel(tableModel);
但我正在使用別人的類(我無法改變)為我生成TableModel。
有沒有其他方法可以實現不可編輯的JTable?
編輯:
我想要不可編輯的JTable,但我想保持行選擇(突出顯示整行)
編輯2:
這是適合我的代碼:
table.setModel(DbUtils.resultSetToTableModel(rs));
for (Class c: Arrays.asList(Object.class, Number.class, Boolean.class)) {
TableCellEditor ce = table.getDefaultEditor(c);
if (ce instanceof DefaultCellEditor) {
((DefaultCellEditor) ce).setClickCountToStart(Integer.MAX_VALUE);
}
}
有沒有其他方法可以實現不可編輯的JTable?
覆蓋JTable
的isCellEditable(...) method
:
JTable table = new JTable( tableModel )
{
@Override
public boolean isCellEditable(int row, int column)
{
return false;
}
};
從JTable
API可以看出,有幾種方法可用於控制表的選擇行為:
setCellSelectionEnabled(boolean cellSelectionEnabled);
setColumnSelectionAllowed(boolean val);
setRowSelectionAllowed(boolean rowSelectionAllowed);
您可以查找具體描述,以查看是否可以通過這些描述實現所需。 從同一個API中也可以看出JTable
繼承了該方法
setEnabled(boolean enabled);
描述為設置是否啟用此組件。 啟用的組件可能會響應用戶輸入,而未啟用的組件則無法響應用戶輸入。 某些組件在被禁用時可能會改變其可視化表示,以便向用戶提供他們無法接受輸入的反饋。
此外,如果您無法更改模型類,但不強制使用精確模型,則可以創建一個從其中擴展的新類,該類將覆蓋isCellEditable
方法並將此模型設置為表。
這是另一種方法:
table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE)
startEditing
操作 DefaultCellEditor#setClickCountToStart(Integer.MAX_VALUE)
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class NonEditableButKeepRowSelectionTableTest {
public JComponent makeUI() {
String[] columnNames = {"String", "Integer", "Boolean"};
Object[][] data = {
{"aaa", 12, true}, {"bbb", 5, false},
{"CCC", 92, true}, {"DDD", 0, false}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@Override public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
JTable table = new JTable(model);
//table.setEnabled(false);
table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
table.getActionMap().put("none", new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
System.out.println("dummy");
}
});
table.getInputMap().put(KeyStroke.getKeyStroke("pressed F2"), "none");
for (Class c: Arrays.asList(Object.class, Number.class, Boolean.class)) {
//TEST: table.setDefaultEditor(c, null);
TableCellEditor ce = table.getDefaultEditor(c);
if (ce instanceof DefaultCellEditor) {
((DefaultCellEditor) ce).setClickCountToStart(Integer.MAX_VALUE);
}
}
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table));
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new NonEditableButKeepRowSelectionTableTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.