【问题标题】:JTable multiple selection without the CTRL没有CTRL的JTable多选
【发布时间】:2016-09-17 22:46:17
【问题描述】:

我正在尝试更改 JTable 的选择行为,以便能够在不使用 CTRL 修饰符的情况下向选择中添加和删除行。方法:

public void changeSelection(int rowIndex,
                        int columnIndex,
                        boolean toggle,
                        boolean extend)

似乎正是我正在寻找的东西,尤其是这种情况:

toggle: true, extend: false. If the specified cell is selected, deselect it. If it is not selected, select it. 

是我的意思。问题是我不能让它工作。也许我遗漏了一些关于内部 JTable 工作的信息,但这是我的代码:

initComponents();

    mainTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    mainTable.setRowSelectionAllowed(true);

    mainTable.setSelectionModel(new DefaultListSelectionModel() {
        @Override
        public void addSelectionInterval(int index0, int index1) {
            if (index0 == index1) {
                for (int i = 0; i < mainTable.getColumnModel().getColumnCount(); i++) {
                    mainTable.changeSelection(index0, i, true, false);
                }
            }
        }

    });

这似乎什么也没做。谁能告诉我这是什么问题?

谢谢。

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    您可以创建自定义ListSelectionModel

    简单示例:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ToggleListSelectionModel extends DefaultListSelectionModel
    {
        @Override
        public void setSelectionInterval(int index0, int index1)
        {
            //  Select multiple lines
    
            if (index0 != index1)
            {
                super.addSelectionInterval(index0, index1);
                return;
            }
    
            //  Toggle selection of a single line
    
            if  (super.isSelectedIndex(index0))
            {
                super.removeSelectionInterval(index0, index0);
            }
            else
            {
                super.addSelectionInterval(index0, index0);
            }
        }
    
        private static void createAndShowGUI()
        {
            String[] numbers = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
            final JList<String> list = new JList<String>( numbers );
            list.setVisibleRowCount( numbers.length );
            list.setSelectionModel(new ToggleListSelectionModel());
    //      list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    
            JButton clear = new JButton("Clear");
            clear.addActionListener( new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    list.clearSelection();
                }
            });
    
            JFrame frame = new JFrame("SSCCE");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new JScrollPane(list), BorderLayout.CENTER);
            frame.add(clear, BorderLayout.PAGE_END);
            frame.setLocationByPlatform( true );
            frame.pack();
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });
        }
    }
    

    该示例是针对 JList,但 JTable 也使用 ListSelectionModel。

    【讨论】:

    • 这仍然有效(Java 8),也可以使用JTable
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多