Java 禁用多列选择

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; }

有没有办法禁用Swing JTable的多列选择?通过覆盖选择模型的选择间隔,我在“Tid”列中禁用了所有选择:

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);             
        }
    }
}