为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

临摹微笑 2019-07-26 15:15:08

单独和不连续的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,例如。



查看完整描述

2 回答

?
元芳怎么了
  1. 如果没有定义为JTable#setSelectionMode(ListSelectionModel.SINGLE_SELECTION),然后CTRL + MOUSE_CLICK

  2. 还是你是说记得上一次被选中?

  3. ListSelectionModel都是由双方使用的JTableJList.

https://img4.mukewang.com/5d351a60000140d401120174.jpghttps://img.mukewang.com/5d351a61000186e201120174.jpghttps://img.mukewang.com/5d351a62000117a401120174.jpghttps://img1.mukewang.com/5d351a7a0001432401120174.jpghttps://img.mukewang.com/5d351a7e000116ea01120174.jpg

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




查看完整回答
反对 回复 2019-07-27
?
尚方宝剑之说

使用MULTIPLE_INTERVAL_SELECTION,如如何使用表:用户选择.

增编:因为MULTIPLE_INTERVAL_SELECTIONListSelectionModel也可用于JList,你也许可以利用后者的HORIZONTAL_WRAP要获得非连续的选择,如下所示。

https://img.mukewang.com/5d351a960001c34603350227.jpg

控制台:

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




查看完整回答
反对 回复 2019-07-27

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信