Frage

Gibt es eine einfache Möglichkeit, die Steuerelemente auf einer JTable zu manipulieren, um unterschiedliche Funktionen bereitzustellen, wenn eine Tastaturtaste gedrückt wird (z. B.STRG-Taste) und eine Zeile ist ausgewählt?Ich wurde gebeten, eine Tabelle zu erstellen, in der durch STRG + Klicken (Mausklick) auf eine Zeile nur die Auswahl einer ausgewählten Zeile aufgehoben und niemals eine Zeile ausgewählt wird.Wenn der Benutzer STRG + auf eine nicht ausgewählte Zeile klickt, passiert nichts.

Ich konnte eine Tabelle erstellen und Funktionen wie STRG + A (Alles auswählen) deaktivieren und überprüfen, ob die Steuertaste gedrückt wird, wenn ein MouseEvent generiert wird, aber ich kann es anscheinend nicht herausfinden Erfahren Sie, wie die Tastenkombination STRG + Klick angepasst werden kann.Hier ist ein Code:

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

In der Methode „mousePressed“ habe ich damit herumgespielt, alle ausgewählten Zeilen aus der Tabelle abzurufen, und wollte dann prüfen, ob sich die neu angeklickte Zeile in den „selectedRows“ befand ...Ich bin mir jedoch nicht sicher, ob es eine Möglichkeit gibt, zu sehen, welche Zeile mit dem MouseEvent verknüpft ist.

(Außerdem weiß ich, dass mit einem erwarteten Verhalten wie diesem nicht zu viel herumgespielt werden sollte, sondern dass es darum geht, ein Altsystem im Unternehmen zu reproduzieren.)

Alle Ideen/Vorschläge wären willkommen!

War es hilfreich?

Lösung

OK, zweite Aufnahme (ich habe die erste gelassen, da sie vielleicht für jemanden anderen Verwendungszweck interessant sein könnte, wer weiß?Angenommen, es dient pädagogischen Zwecken ...:-)).

Ich habe mir den Quellcode von JTable angeschaut und herausgefunden, dass Mausereignisse über das Look and Feel behandelt werden.Da ich weiß, wie es mit der Steuertaste umgeht, könnte ich die Methode „changeSelection“ sicher überschreiben, um das zu tun, was Sie brauchen.
Ich finde Anforderungen etwas seltsam (Sie können immer noch Umschalt+Klick verwenden, nicht wahr?), aber ich kenne den Kontext nicht.

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

Viel einfacher und genau das, was Sie brauchen!

Übrigens, vielen Dank für die Bereitstellung eines so einfachen, guten Testfalls. Ich hätte es vielleicht nicht versucht, wenn ich ihn selbst schreiben müsste ...:-D Es war eine interessante und lehrreiche Herausforderung.

Andere Tipps

Ich hatte Erfolg mit dem folgenden, obwohl ich nicht sicher bin, das ist die beste Methode ...

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

Ersetzen Sie die Linien definieren table in Ihrem Code mit nur:

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

Wenn Sie eine nicht ausgewählten Zeilen gedrückter Ctrl-Taste, wird es kurz ausgewählt, dann nicht ausgewählt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top