![](/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.