문제

Keyb 행의 Ctrl + 클릭 (마우스 클릭)이 선택한 행만 선택 해제하는 테이블을 만들도록 요청 받았으며 행을 선택하지 마십시오. 사용자 Ctrl +가 선택되지 않은 행을 클릭하면 아무 일도 일어나지 않습니다.

테이블을 만들고 ctrl + a와 같은 기능을 비활성화 할 수 있었으며 (모두 선택), Mouseevent가 생성 될 때 제어 버튼이 누르는지 확인할 수 있었지만 파악할 수없는 것 같습니다. Ctrl + 클릭을 조정하는 방법을 알아 봅니다. 코드는 다음과 같습니다.

package nicky;

import javax.swing.*;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;

public class TableTester extends JPanel {
    public TableTester() {
        super(new GridLayout(1,0));

        final String[] columnNames = {"First Name",
                                      "Last Name",
                                      "Sport",
                                      "# of Years",
                                      "Vegetarian"};

        final Object[][] data = {
            {"Tom",   "Roberts","Athletic", new Integer(5),  new Boolean(false)},
            {"Sarah", "Watt",   "Football", new Integer(3),  new Boolean(true)},
            {"Laura", "Brown",  "Swimming", new Integer(2),  new Boolean(false)},
            {"Simon", "Smith",  "Tennis",   new Integer(20), new Boolean(true)},
            {"Paul",  "Jones",  "Rugby",    new Integer(10), new Boolean(false)}
        };

        JTable table = new JTable(data, columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(500, 100));

        table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        table.addMouseListener(new MouseListener(){
            public void mouseEntered(MouseEvent me){}
            public void mouseExited(MouseEvent me){}
            public void mouseReleased(MouseEvent me){}
            public void mouseClicked(MouseEvent me){}
            public void mousePressed(MouseEvent me){
                if (me.isControlDown()){
                    System.out.println("This is working ");
                }
            }
        });

        InputMap inputMap = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);
        inputMap.put(keyStroke, "none");

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }

    private static void createAndShowGUI() {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("TableTester");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TableTester newContentPane = new TableTester();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

무소한 방법으로 나는 테이블에서 선택한 모든 행을 얻는 데 연주 한 다음 새로 클릭 된 행이 선택된 줄에 있는지 확인하려고했습니다. 그러나, 나는 Mouseevent와 관련된 행이 있는지 확인하십시오.

(또한, 나는 이것과 같은 예상되는 행동을 너무 많이 가지고 놀어서는 안된다는 것을 알고 있지만 회사의 레거시 시스템을 복제하는 것입니다).

모든 아이디어/제안에 감사드립니다!

도움이 되었습니까?

해결책

좋아, 두 번째 테이크 (나는 다른 사용에 대해 누군가에게 관심을 가질 수있는 첫 번째 것을 떠났다.

나는 Jtable의 소스 코드를 살펴보고 마우스 이벤트가 모양과 느낌으로 처리된다는 것을 알았습니다. 제어 키를 어떻게 처리하는지 알면 변경 선택 방법을 안전하게 무시하여 필요한 작업을 수행 할 수 있습니다.
요구 사항이 약간 이상하다고 생각합니다 (여전히 Shift+Click, No?)을 사용할 수 있지만 컨텍스트를 모릅니다.

class SpecialTable extends JTable
{
    SpecialTable(Object[][] data, String[] columnNames)
    {
        super(data, columnNames);
// That's already the default        
//        setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    }

    /**
     * Called by javax.swing.plaf.basic.BasicTableUI.Handler.adjustSelection(MouseEvent)
     * like: table.changeSelection(pressedRow, pressedCol, e.isControlDown(), e.isShiftDown());
     */
    @Override
    public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend)
    {
        if (toggle && !isRowSelected(rowIndex))
            return; // Don't do the selection
        super.changeSelection(rowIndex, columnIndex, toggle, extend);
    }
}

훨씬 단순하고 정확히 필요한 것!

BTW, 간단한 좋은 테스트 케이스를 제공해 주셔서 감사합니다. 직접 써야한다면 시도하지 않았을 수도 있습니다 ... : D 흥미롭고 학습 도전이었습니다.

다른 팁

나는 그것이 최고의 방법인지 확실하지 않지만 다음과 같은 성공을 거두었습니다 ...

class SpecialTable extends JTable
{
    boolean bIsControlDown;
    int clickedRow;

    SpecialTable(Object[][] data, String[] columnNames)
    {
        super(data, columnNames);
//        setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        getSelectionModel().addListSelectionListener(this);
        addMouseListener(new MouseInputAdapter()
        {
            public void mousePressed(MouseEvent me)
            {
                bIsControlDown = me.isControlDown();
                clickedRow = rowAtPoint(me.getPoint());
            }
        });
    }

    public void valueChanged(ListSelectionEvent evt)  
    {
        super.valueChanged(evt);
        if (bIsControlDown)
        {
            if (!evt.getValueIsAdjusting())
            {
//                System.out.println(evt);
//                System.out.println("=> " + clickedRow);
                getSelectionModel().removeSelectionInterval(clickedRow, clickedRow);
            }
        }
    }
}

줄 정의를 교체하십시오 table 코드에서만 :

    JTable table = new SpecialTable(data, columnNames);
    table.setPreferredScrollableViewportSize(new Dimension(500, 100));

선택되지 않은 행을 제어하면 간단히 선택한 다음 선택되지 않은 상태입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top