Java 禁用多列选择
有没有办法禁用Swing JTable的多列选择?通过覆盖选择模型的选择间隔,我在“Tid”列中禁用了所有选择:Java 禁用多列选择,java,swing,jtable,Java,Swing,Jtable,有没有办法禁用Swing JTable的多列选择?通过覆盖选择模型的选择间隔,我在“Tid”列中禁用了所有选择: myTable.getColumnModel().setSelectionModel(new DefaultListSelectionModel() { private boolean isSelectable(int index0, int index1) { return index1 != 0; }
myTable.getColumnModel().setSelectionModel(new DefaultListSelectionModel() {
private boolean isSelectable(int index0, int index1) {
return index1 != 0;
}
@Override
public void setSelectionInterval(int index0, int index1) {
if(isSelectable(index0, index1)) {
super.setSelectionInterval(index0, index1);
}
}
@Override
public void addSelectionInterval(int index0, int index1) {
if(isSelectable(index0, index1)) {
super.addSelectionInterval(index0, index1);
}
}
});
我的猜测是,也可以通过覆盖选择模型中的方法来禁止选择多个列。但我真的不知道如何做到这一点
允许的选择
不允许的选择
首先从
JTable
TableColumnModel columnModel = table.getColumnModel();
接下来,为TableColumnModel
ListSelectionModel selectionModel = columnModel.getSelectionModel();
使用此选项,您可以设置模型将使用的selectionMode
,例如
selectionModel.setSelectionModel(ListSelectionModel.SINGLE_SELECTION)
有关更多详细信息,请参阅JavaDocs和
可运行的示例。。。。
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.ListSelectionModel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.table.DefaultTableModel;
公开课考试{
公共静态void main(字符串[]args){
新测试();
}
公开考试(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
公共测试窗格(){
setLayout(新的BorderLayout());
DefaultTableModel=新的DefaultTableModel(0,10);
对于(int行=0;行<10;行++){
字符串[]数据=新字符串[10];
for(int col=0;col<10;col++){
数据[列]=行+x+列;
}
model.addRow(数据);
}
JTable table=新的JTable(模型);
table.setColumnSelectionAllowed(真);
table.setRowSelectionAllowed(真);
table.getColumnModel().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
添加(新JScrollPane(表));
}
}
}
事实上,这是对我已经存在的所需覆盖的一个足够简单的补充
@Override
public void setSelectionInterval(int index0, int index1) {
if (isSelectable(index0, index1)) {
if (index0==index1) { //The if condition needed.
super.setSelectionInterval(index0, index1);
}
}
}
在查看JavaDoc和
DefaultListSelectionModel
时,我意识到index0
和index1
正是我所要寻找的——列span。因此,当且仅当两列索引相等时,通过调用超类,无法选择多个列。请参阅JTable.setColumnSelectionAllowed(true)@mKorbel关于你的“扩展”评论,我没有说要使用JTable#setSelectionMode
,我说的是获取TableColumnModel
并使用它的ListSelectionModel
。如果要进一步修改行为,需要为提供自己的ListSelectionModel
it@MadProgrammer然后,在不使用getAnchor的情况下,您将丢失OP(通过覆盖选择模型的选择间隔来生成列)答案的提示/LeadSelectionIndex@mKorbel是的,我很笨,但是,如果OP只是想将列选择限制为单个列,那么他们为什么还要做其他事情呢?当然,他们希望限制选择,以便无法选择第一列,这将建议在单间隔选择下使用JavaDocs for ListSelectionModel中的自定义ListSelectionModel
:“/../除非给定的间隔与现有选择相邻或重叠,因此可以用于增加它”。这不是我想要的-我不希望用户能够在多个列上增加选择(跨度)。我希望允许他们在同一列中选择多行,而不是多列?
@Override
public void setSelectionInterval(int index0, int index1) {
if (isSelectable(index0, index1)) {
if (index0==index1) { //The if condition needed.
super.setSelectionInterval(index0, index1);
}
}
}