猿问
下载APP

单独和不连续的JTable细胞选择

单独和不连续的JTable细胞选择

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

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

编辑:

我试过@mKorbel尼斯SSCCE。对于List来说,它很好,但是它似乎不能完全处理表。下面是一个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);
                }

        };

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



临摹微笑
浏览 124回答 2
2回答

元芳怎么了

如果没有定义为JTable#setSelectionMode(ListSelectionModel.SINGLE_SELECTION),然后CTRL + MOUSE_CLICK还是你是说记得上一次被选中?ListSelectionModel都是由双方使用的JTable和JList.import java.awt.Component;import java.awt.event.InputEvent;import java.awt.event.MouseEvent;import javax.swing.*;public class Ctrl_Down_JList {     private static void createAndShowUI() {         String[] items = {"Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"};         JList myJList = new JList(items) {             private static final long serialVersionUID = 1L;             @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);             }         };         JFrame frame = new JFrame("Ctrl_Down_JList");         frame.getContentPane().add(new JScrollPane(myJList));         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.pack();         frame.setLocationRelativeTo(null);         frame.setVisible(true);     }     public static void main(String[] args) {         java.awt.EventQueue.invokeLater(new Runnable() {             @Override             public void run() {                 createAndShowUI();             }         });     }

尚方宝剑之说

使用MULTIPLE_INTERVAL_SELECTION,如如何使用表:用户选择.增编:因为MULTIPLE_INTERVAL_SELECTION的ListSelectionModel也可用于JList,你也许可以利用后者的HORIZONTAL_WRAP要获得非连续的选择,如下所示。控制台:[Cell:06] [Cell:06,&nbsp;Cell:16] [Cell:06,&nbsp;Cell:16,&nbsp;Cell:18] [Cell:06,&nbsp;Cell:08,&nbsp;Cell:16,&nbsp;Cell:18]代码:import&nbsp;java.awt.*;import&nbsp;java.util.Arrays;import&nbsp;javax.swing.*;import&nbsp;javax.swing.event.*;/** &nbsp;*&nbsp;@see&nbsp;http://stackoverflow.com/questions/7620579 &nbsp;*&nbsp;@see&nbsp;http://stackoverflow.com/questions/4176343 &nbsp;*/public&nbsp;class&nbsp;ListPanel&nbsp;extends&nbsp;JPanel&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;int&nbsp;N&nbsp;=&nbsp;5; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;DefaultListModel&nbsp;dlm&nbsp;=&nbsp;new&nbsp;DefaultListModel(); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;JList&nbsp;list&nbsp;=&nbsp;new&nbsp;JList(dlm); &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ListPanel()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(new&nbsp;GridLayout()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;N&nbsp;*&nbsp;N;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;"Cell:"&nbsp;+&nbsp;String.format("%02d",&nbsp;i); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlm.addElement(name);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.setLayoutOrientation(JList.HORIZONTAL_WRAP); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.setVisibleRowCount(N); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.setCellRenderer(new&nbsp;ListRenderer()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.addListSelectionListener(new&nbsp;SelectionHandler()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.add(list); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;class&nbsp;ListRenderer&nbsp;extends&nbsp;DefaultListCellRenderer&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ListRenderer()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setBorder(BorderFactory.createLineBorder(Color.red)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Component&nbsp;getListCellRendererComponent(JList&nbsp;list,&nbsp;Object &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value,&nbsp;int&nbsp;index,&nbsp;boolean&nbsp;isSelected,&nbsp;boolean&nbsp;cellHasFocus)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JComponent&nbsp;jc&nbsp;=&nbsp;&nbsp;(JComponent)&nbsp;super.getListCellRendererComponent( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list,&nbsp;value,&nbsp;index,&nbsp;isSelected,&nbsp;cellHasFocus); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jc.setBorder(BorderFactory.createEmptyBorder(N,&nbsp;N,&nbsp;N,&nbsp;N)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;jc; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;class&nbsp;SelectionHandler&nbsp;implements&nbsp;ListSelectionListener&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;valueChanged(ListSelectionEvent&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!e.getValueIsAdjusting())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Arrays.toString(list.getSelectedValues())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;display()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFrame&nbsp;f&nbsp;=&nbsp;new&nbsp;JFrame("ListPanel"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.add(this); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.pack(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.setLocationRelativeTo(null); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.setVisible(true); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EventQueue.invokeLater(new&nbsp;Runnable()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;ListPanel().display(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答