JDialog mit Rückgabe

Neben dem kleinen Problem mit meiner Progressbar hab ich noch ne andere Baustelle, an der ich grad hänge. Und zwar erzeuge ich per JMenuItem einen neuen JDialog der so ausschaut:

(Sind erstmal nur paar Beispiele, erweiter ich dann wenns klappt)

Wenn ich auf die Tabelle doppelklicke soll sich ein neuer Dialog öffnen, der eine Taste bzw wenn shift etc gedrückt wurde eine Tastenkombination abfragen und in die Tabelle eintragen. Die möchte ich später wieder auslesen. Also hab ich an die JTable nen MouseListener angehängt, der bei nem Doppelklick einen neuen Dialog öffnet:

            System.out.println("Doppelklick!");
            new KeyEingebenDialog(parent, true, hotkeyTable.getValueAt(hotkeyTable.getSelectedRow(), 0).toString()).setVisible(true);
        }```
(Hab das nur verkürzt um zu testen ob das soweit klappt. An der Stelle hab ich zwar auch noch ein Problem, aber dazu komme ich später, da erstmal ein anderes gelöst werden muss. Und zwar schaut der erzeugte Dialog so aus:


Ich hab an den Dialog nen KeyListener angehängt. Allerdings kann ich drücken was ich will, der KeyListener wird nicht ausgeführt. Wieso? Und das andere oben angesprochene, hinten angestellte Problem wäre dann wie ich das KeyEvent zurückgeben. Ich dachte mir ich erzeuge den modalen KeyEingebenDialog und speicher das KeyEvent in dem Dialog als Attribut. Das der Dialog modal ist, wird KeyEvent immer nen Wert vom Programm bekommen, doer null wenn er abgebrochen wird. Auf jeden Fall wird der Dialog aber fertig sein, wenn es geschlossen wird. So kann ich nach dem setVisible mit nem Getter auf das KeyEvent zugreifen und es eintragen bzw Speichern. Da nur die Frage ob der Getter wirklich erst ausgeführt wird, wenn der Dialog geschlossen wird? Und ist die Methode so in Ordnung?

MfG

KeyListener hängen immer mit Focus zusammen, in deinem Screenshot hat der Button den Focus, nur dort ein KeyListener hilft etwas

hier ein Beispielcode:

                @Override
                public void keyPressed(KeyEvent e)         {
                    System.out.println("pressed");
                }
            };

        JPanel p = new JPanel();
        p.add(new JLabel("Test"));
        p.add(new JButton("Test"));

        final JDialog dialog = new JDialog((Frame)null, "Title", true);
        dialog.setContentPane(p);
        dialog.pack();
        
        p.requestFocusInWindow();
        p.addKeyListener(k);
        dialog.setVisible(true);

ohne Button funktioniert der KeyListener auf den Dialog,

mit Test-Button schnappt sich dieser hier den Focus,
mit requestFocusInWindow() bekommt das JPanel den Focus, aber nur wenn nach dem pack() aufgerufen…, ob das allgemein funktioniert…,
dann jedenfalls klappt in diesem Fall KeyListener auf das JPanel, noch nicht wieder auf Dialog

je nachdem wie dein Dialog aufgebaut ist kannst du vielleicht zu einem funktionierenden Stand kommen


KeyBindings ist allgemein KeyListener überlegen, aber sicher auch komplizierter,
vielleicht hast du dafür die Muße

Java Tip 72: Press Escape to close your Swing dialog windows | JavaWorld
(Stand des zweiten Links 1999, gar 1. April…, aber erster Link erstes Suchergebnis zu ‚keylistener jdialog‘ und von @vfl_freak , auch hier bekannt :wink: )

Vielen Dank! Ich schau mir die Links mal an. Und das mit dem requestFocusInWindow(); Wird denke ich nicht funktionieren, da der User ja z.B. mal mit der Maus über den Button hovern könnte oä und dann funktionierts nicht mehr. Denke mal das ist durchaus realistisch, das das mal vorkommen wird. Aber ich häng den KeyListener dann mal an den Button, sollte dann evtl schon genügen

Maus drüber malt zwar Focus-Rahmen, ändert bei mir aber nicht die Funktionalität,
Tab würde allerdings den Button wieder ins Spiel bringen

Ah, ok, das wusste ich nicht. Ich schau mal was sich so machen lässt

Entsprechend dem ersten Bild sollen die Tastenkombinationen in einer Tabelle eingetragen werden. Dazu solltest Du für die zweite Spate einen eigenen [JAPI]TableCellEditor[/JAPI] erzeugen, und an diesen den Keylistener hängen…

bye
TT

Habe mich seit der Erstellung des Threads nichtmehr darum gekümmert. Aber grade wollte ich wieder weiter dranmachen, das mit dem tableCellRenderer probier ich mal, aber davor hätte ich ne Frage:

Um das KeyEvent in nen für den User verständlichen String umzuwandeln habe ich folgende Methode geschrieben:

        String keys = "";
        if (e.isControlDown()) {
            keys += "STRG+";
        }
        if (e.isAltDown()) {
            keys += "ALT+";
        }
        if (e.isShiftDown()) {
            keys += "SHIFT+";
        }
        keys += e.getKeyChar();

        return keys;
    }```

Er funktioniert auch soweit. Allerdings sobald STRG gedrückt wurde, wird der KEyChar unleserlich:


Dazu ist der KEyCode IMMER 0, egal ob Extended oder nicht.

Das der Testcode
```public static void main(String[] args) {
        JFrame frame = new JFrame("ListenerTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setSize(100, 100);

        frame.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                System.out.println("Gedrückte Kombination: " + KeyListenerTest.toString(e));
                System.out.println("KeyCode: " + e.getKeyCode());
                System.out.println("Param: " + e.paramString());
                System.out.println("Extended: " + e.getExtendedKeyCode());
                System.out.println("Modifiers: " + e.getModifiers());
                System.out.println();
            }
        });

        frame.setVisible(true);
    }```

Hab ich irgendwas nicht bedacht? Weil den KeyCode bräuchte ich später wenn ich das ganze in die Tabelle eintrage ja wieder, wenn im Programm ne Taste  Tastenkombination gedrückt wurde, die mit einer aus der Tabelle übereinstimmt. Oder ich müsste die KEyEvents mit equals vergleichen, wobei ich nciht weiß ob das passend überschrieben wurde. 
Und den KeyChar brauch ich ja auch, weil so nen Kästchen anzuzeigen soll ja nicht sein, genauso sollte der Char nicht groß und Klein sein, nur ob Shift gedrückt wurde. Wobei man da mit der Character-Klasse arbeiten kann

getKeyCode() ist wohl nur in der keyPressed()-Methode abzufragen, wo Strg und anderes jeweils einzelne Ereignisse sind,
getKeyTyped() liefert den insgesamt eingetippten zusammengesetzten Char

keine Web-Suche nach Methoden, kein Tutorial zu KeyListener?..
java - KeyTypedEvent KeyEvent’s KeyCode is always 0? - Stack Overflow