Java 单个而非连续的JTable';s细胞选择

Java 单个而非连续的JTable';s细胞选择,java,swing,jtable,selection,cells,Java,Swing,Jtable,Selection,Cells,是否有任何干净的方法允许用户选择JTable的多个非连续单元格? 或者我被迫实现自己的ListSelectionModel 我在JTable上使用了setCellSelectionEnabled()和setSelectionModel()方法,但我只能选择连续单元格组 编辑: 我试过@mKorbel nice SSCCE。它可以很好地用于列表,但似乎不能完全用于表。这是一个SSCCE: import java.awt.Component; import java.awt.event.Input

是否有任何干净的方法允许用户选择JTable的多个非连续单元格? 或者我被迫实现自己的ListSelectionModel

我在JTable上使用了setCellSelectionEnabled()和setSelectionModel()方法,但我只能选择连续单元格组

编辑:

我试过@mKorbel nice SSCCE。它可以很好地用于列表,但似乎不能完全用于表。这是一个SSCCE:

import java.awt.Component;

import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class TableSelection extends JFrame{
    String[] columnNames = {"First Name",
            "Last Name",
            "Sport",
            "# of Years",
            "Vegetarian"};
    Object[][] data = {
            {"Kathy", "Smith",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"John", "Doe",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Sue", "Black",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Jane", "White",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Joe", "Brown",
             "Pool", new Integer(10), new Boolean(false)}
        };

    public TableSelection(){
        JPanel main= new JPanel();
        JTable table = new JTable(data, columnNames){
             @Override
                protected void processMouseEvent(MouseEvent e) {
                    int modifiers = e.getModifiers() | InputEvent.CTRL_MASK;
                    // change the modifiers to believe that control key is down
                    int modifiersEx = e.getModifiersEx() | InputEvent.CTRL_MASK;
                    // can I use this anywhere?  I don't see how to change the modifiersEx of the MouseEvent
                    MouseEvent myME = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), modifiers, e.getX(),
                            e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton());
                    super.processMouseEvent(myME);
                }

        };
        JScrollPane pane = new JScrollPane(table);
        main.add(pane);
        this.add(main);

        this.setSize(800, 600);
        this.setVisible(true);
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new TableSelection();
    }

}
我可以选择非连续行,但不能选择单个单元格。我的意思是,我希望能够选择单元格0,0和3,3为例

  • 如果未为
    JTable\setSelectionMode(ListSelectionModel.SINGLE\u SELECTION)
    定义,则
    CTRL+鼠标单击

  • 还是说你还记得上次选中的

  • JTable
    JList
    使用

  • 使用,如中所示

    附录:由于的
    多间隔\u选择
    也可用于
    JList
    ,因此您可以利用后者的
    水平环绕
    来获得非连续选择,如下所示

    控制台:

    [Cell:06] [Cell:06, Cell:16] [Cell:06, Cell:16, Cell:18] [Cell:06, Cell:08, Cell:16, Cell:18] [单元格:06] [单元格:06,单元格:16] [单元格:06,单元格:16,单元格:18] [单元格:06,单元格:08,单元格:16,单元格:18] 代码:

    import java.awt.*;
    导入java.util.array;
    导入javax.swing.*;
    导入javax.swing.event.*;
    /**
    *@见http://stackoverflow.com/questions/7620579
    *@见http://stackoverflow.com/questions/4176343
    */
    公共类ListPanel扩展了JPanel{
    专用静态最终整数N=5;
    私有DefaultListModel dlm=新的DefaultListModel();
    专用JList列表=新JList(dlm);
    公共列表面板(){
    超级(新网格布局());
    对于(int i=0;i
    嗯,它似乎不起作用。我无法以这种方式选择多个不连续的单个单元格。我正在使用ctrl修改器在Windows上进行尝试。但我现在正在检查bug,因为即使@mKorbel的解决方案似乎也能与我的JTable一起工作。也许我在别的地方有一个bug。我试图从我的代码中提取它,但它不是那么简单。我涉及到几个类:一个使用自定义渲染器和编辑器构建JTable扩展的构建器,等等。我已经在上面提出了一个潜在的替代方案。@trashgod,谢谢<代码>列表。设置VisibleRowCount(N),现在我明白了为什么我在这里发布的代码中漏掉了,然后被我们的Swing投票否决了Lady@Heisenbug我认为ListSelectionModel不可能做到这一点,因为它只有一个维度,如果列可以工作,那么行就不能工作,反之亦然,在一个非自由解决方案中是否存在同步的AbstractTableModel(对行/列进行编号,添加或删除行/列,但严格要求重新排序列(false))2.仅包含布尔值的AbstractTableModel,在CustomRenderer中(也在preparedRenderer中)画图背景如果第二个.TableColumn包含true,这应该是直接的,但不可能是两个一维选择模型的叠加。你需要一个真正的二维模型。以前在旧的codeguru网站上有一个例子,需要在ui委托中进行调整。不知道它是否/在哪里now@kleopatra:谢谢。我想我会的找到一个不同的解决方案。我可以为你的问题提供赏金吗?也许还有其他解决方案,@mKorbel:当然。因此,对于kleopatra来说,默认的选择模式是不可能的。但是如果你对一个可能的解决方案感兴趣,你可以自由地提供赏金。这取决于你:)。 [Cell:06] [Cell:06, Cell:16] [Cell:06, Cell:16, Cell:18] [Cell:06, Cell:08, Cell:16, Cell:18]
    import java.awt.*;
    import java.util.Arrays;
    import javax.swing.*;
    import javax.swing.event.*;
    
    /**
     * @see http://stackoverflow.com/questions/7620579
     * @see http://stackoverflow.com/questions/4176343
     */
    public class ListPanel extends JPanel {
    
        private static final int N = 5;
        private DefaultListModel dlm = new DefaultListModel();
        private JList list = new JList(dlm);
    
        public ListPanel() {
            super(new GridLayout());
            for (int i = 0; i < N * N; i++) {
                String name = "Cell:" + String.format("%02d", i);
                dlm.addElement(name);            
            }
            list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
            list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
            list.setVisibleRowCount(N);
            list.setCellRenderer(new ListRenderer());
            list.addListSelectionListener(new SelectionHandler());
            this.add(list);
        }
    
        private class ListRenderer extends DefaultListCellRenderer {
    
            public ListRenderer() {
                this.setBorder(BorderFactory.createLineBorder(Color.red));
            }
    
            @Override
            public Component getListCellRendererComponent(JList list, Object
                value, int index, boolean isSelected, boolean cellHasFocus) {
                JComponent jc =  (JComponent) super.getListCellRendererComponent(
                    list, value, index, isSelected, cellHasFocus);
                jc.setBorder(BorderFactory.createEmptyBorder(N, N, N, N));
                return jc;
            }
        }
    
        private class SelectionHandler implements ListSelectionListener {
    
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    System.out.println(Arrays.toString(list.getSelectedValues()));
                }
            }
        }
    
        private void display() {
            JFrame f = new JFrame("ListPanel");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(this);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new ListPanel().display();
                }
            });
        }
    }