Menüacceleratoren verschwinden bei JTree

tmjuk

Mitglied
Hallo,

mich plagt da ein kleines Problem.
Ich verwende in einer UI ein Menü mit Acceleratoren.
Und diese funktionieren leider nicht so wie erhofft.
Durch herum probieren bin ich darauf gestossen, dass es am JTree liegt, welcher ebenfalls in der UI ist.

Probiert doch mal bitte folgenden Codeschnipsel aus.
Der JTree ist erst mal auskommentiert.
Drückt man nun CTRL-C/X/V kommen die entsprechenden Meldungen.
Kommentiert man das Label aus und verwendet statt dessen den Tree,
werden die Acceleratoren blockiert.

Wie kann man dem am geschicktesten aus dem Weg gehen?
Java:
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;

public class testMenu extends JFrame {
  public testMenu() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JMenuBar bar = new JMenuBar();
    JMenu menu = new JMenu("File");
    menu.setMnemonic('f');
    bar.add(menu);
    
    
    EditListener l = new EditListener();
    
    
    
    JMenuItem exit = new JMenuItem("Exit");
    exit.setMnemonic('x');
    exit.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        System.out.println("Exit performed");
        testMenu.this.dispose();
        System.exit(0);
      }
    });
    menu.add(exit);

    menu = new JMenu("Edit");
    menu.setMnemonic('e');
    bar.add(menu);

    
    JMenuItem mi;
    
    mi = menu.add(new JMenuItem("Cut", 't'));
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));
    mi.addActionListener(l);
    mi = menu.add(new JMenuItem("Copy", 'c'));
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));
    mi.addActionListener(l);
    mi = menu.add(new JMenuItem("Paste", 'p'));
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK));
    mi.addActionListener(l);

    setJMenuBar(bar);
    getContentPane().add(new JLabel("Test")); // <-- mit Label gehts
    //getContentPane().add(new JTree()); // <-- mit Tree gibts Probleme

    pack();
    setSize(300, 300);
    setVisible(true);
  }

  private class EditListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      System.out.println(e.getActionCommand());
      
    }
  }

  public static void main(String arg[]) {
    new testMenu();
  }

  

}

Danke im Voraus

Torsten
 

tmjuk

Mitglied
Hej,

was ich vielleicht noch erwähnen sollte:
Ich habe es bereits mit ActionMap/InputMap versucht. Mit dem gleichen Resultat.
Die JTree-Komponente "schluckt" die Acceleratoren:
Code:
CTRL+A
CTRL+X
CTRL+C
CTRL+V

Allerdings nur, solange der Tree den Fokus hat. Setze ich den Fokus auf ein anderes UI-Element funktioniert es.

Bis bald
Torsten
 

Michael...

Top Contributor
Das liegt daran, dass bei JTree (gilt auch für Textkomponenten usw.) für diese KeyStrokes bereits Actions in der Input bzw. ActionMap definiert wurden.
Wenn die Standard Actions für den Anwendungsfall nicht passen, bleibt einem vermutlich nichts anderes übrig, als die Einträge in der InputMap/ActionMap dieser Komponenten zu überschreiben.

Das ist zumindest eine Lösung Dir spontan einfällt, eventuell gibt es bessere...
 

tmjuk

Mitglied
Ja, so was in der Richtung dachte ich auch.

Ich hatte da noch die Möglichkeit im Auge, den Fokus auf ein anderes Element zu setzen, sobald der JTree den Fokus erhält.
Ist recht einfach zu bewerkstelligen - hat aber natürlich den Nachteil, dass eine eventuelle Tastaturnavigation im Tree flöten geht.
Also überschreiben...

Hier als Beispiel:
Java:
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;

public class testMenu extends JFrame {
  public testMenu() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JMenuBar bar = new JMenuBar();
    JMenu menu = new JMenu("File");
    menu.setMnemonic('f');
    bar.add(menu);
    
    
    EditListener l = new EditListener();
    
    
    
    JMenuItem exit = new JMenuItem("Exit");
    exit.setMnemonic('x');
    exit.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        System.out.println("Exit performed");
        testMenu.this.dispose();
        System.exit(0);
      }
    });
    menu.add(exit);

    menu = new JMenu("Edit");
    menu.setMnemonic('e');
    bar.add(menu);

    
    JMenuItem mi;
    
    mi = menu.add(new JMenuItem("Cut", 't'));
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));
    mi.addActionListener(l);
    mi = menu.add(new JMenuItem("Copy", 'c'));
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));
    mi.addActionListener(l);
    mi = menu.add(new JMenuItem("Paste", 'p'));
    mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK));
    mi.addActionListener(l);

    setJMenuBar(bar);
    baum = new JTree();
    baum.getInputMap(javax.swing.JComponent.WHEN_FOCUSED).
            put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK),
            "Kopieren");
    baum.getActionMap().put("Kopieren", new javax.swing.AbstractAction(){
        public void actionPerformed(java.awt.event.ActionEvent e){
            System.out.println("Shortcut CTRL+C vom JTree");
        }
    });
    
    getContentPane().add(baum);

    pack();
    setSize(300, 300);
    setVisible(true);
  }

  private class EditListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      System.out.println(e.getActionCommand());
      
    }
  }
  
  public static void main(String arg[]) {
    new testMenu();
  }

  private JTree baum;

}

Danke
Torsten
 
G

Gast2

Gast
Wenn du die StandardsAction nicht willst musst du diese aus der ActionInput Map einfach nur rauslöschen. Aber ich würde es als User störend finden wenn eien Tree nicht wie gewohnt auf CTRL-C und V funktionieren würde.
 

tmjuk

Mitglied
Nun ich dachte das so zu realisieren, dass, je nach augenblicklicher Verwendung, der Shortcut an die jeweilig relevante Stelle geleitet wird.
Klingt komisch, ist aber so:lol:

Also als Beispiel:
Ich habe in der GUI den Tree und eine Zeichenfläche.
Ist in der Zeichenfläche nichts ausgewählt aber im Tree ist ein Beitrag ausgewählt, wird z.B. CTRL+C eben für den Tree verwendet.
Ist in der Zeichenfläche was ausgewählt, benutzt man CTRL+C eben für die Zeichenfläche.

Werde das noch weiter durchdenken. Aber ich denke schon, dass das klappen wird.

Torsten
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
D JavaFX Menu soll nicht bei jedem Click verschwinden AWT, Swing, JavaFX & SWT 8
M Gezeichnete Linine verschwinden AWT, Swing, JavaFX & SWT 7
P Scrollbalken verschwinden beim Zoomen AWT, Swing, JavaFX & SWT 4
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
B setCursor() lässt Cursor ganz verschwinden AWT, Swing, JavaFX & SWT 9
F Swing JTextfield Beispieltext soll nach Klick verschwinden AWT, Swing, JavaFX & SWT 3
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
A AWT Nach dem generieren von bildern verschwinden diese wieder AWT, Swing, JavaFX & SWT 9
M Verschwinden von gezeichneten Objekten nach Fensterverkleinerung AWT, Swing, JavaFX & SWT 3
A SWT Tooltip soll nicht verschwinden, solange User mit Maus auf Control ist AWT, Swing, JavaFX & SWT 5
C AWT Buttons verschwinden, wenn Fenster Vollbild gesetzt wird AWT, Swing, JavaFX & SWT 38
N Teile des GUI verschwinden AWT, Swing, JavaFX & SWT 8
J Hintergrundbild des JFrames lässt Textboxen verschwinden? AWT, Swing, JavaFX & SWT 4
data89 Komponenten verschwinden von JPanel, wenn ich den HG selbst male - Hilfeeee AWT, Swing, JavaFX & SWT 16
U SWT Linien verschwinden nach Verschieben AWT, Swing, JavaFX & SWT 3
G Hilfe Meine JPanels verschwinden im Müll AWT, Swing, JavaFX & SWT 10
G JTabbedPane verschwinden einfach bei Paelaktualisierung AWT, Swing, JavaFX & SWT 7
D SWING AWT - Komponenten komplett verschwinden lassen AWT, Swing, JavaFX & SWT 6
A Icons von Kontextmenüeinträgen verschwinden (SWT) AWT, Swing, JavaFX & SWT 2
K JSpinner Werte verschwinden bei Panel Wechsel AWT, Swing, JavaFX & SWT 2
G JPanel verschwinden lassen, aber wie? AWT, Swing, JavaFX & SWT 3
T Problem mit Image, restliche Elemente der Gui verschwinden AWT, Swing, JavaFX & SWT 9
B NULL Layout - TextFelder verschwinden AWT, Swing, JavaFX & SWT 8
G JTabbedPane: Tabs verschwinden lassen ? AWT, Swing, JavaFX & SWT 10
X Verschwinden des JMenu unterbinden AWT, Swing, JavaFX & SWT 3
L Labels verschwinden! AWT, Swing, JavaFX & SWT 10
G JTabbedPane: Tabs verschwinden lassen und wieder anzeigen AWT, Swing, JavaFX & SWT 3
juppi JFrame will nicht wieder verschwinden AWT, Swing, JavaFX & SWT 2
FrittenFritze JTree, LazyLoading und "Rückwärtstraversion" AWT, Swing, JavaFX & SWT 3
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
W Swing Anzeigefehler bei JTree AWT, Swing, JavaFX & SWT 1
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
H Swing JTree: Zählt der rootNode mit? AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
R JTree behandeln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
T JTree mit Symbolen? AWT, Swing, JavaFX & SWT 8
R Anfängerfrage: Ansichten des JTree AWT, Swing, JavaFX & SWT 1
H Swing JTree Minimumgröße AWT, Swing, JavaFX & SWT 2
F Swing JTree + DiffUtils // Markierung Nodes aufheben AWT, Swing, JavaFX & SWT 2
I JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Swing JTree AWT, Swing, JavaFX & SWT 4
M Nodes in JTree nicht anzeigen AWT, Swing, JavaFX & SWT 0
T JTree mit Cloud verbinden AWT, Swing, JavaFX & SWT 0
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
S Swing JTree verwirrt mich AWT, Swing, JavaFX & SWT 2
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
J JTree speichern AWT, Swing, JavaFX & SWT 4
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
B JTree mit Ordneransicht in JPanel einbinden AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
V Swing JTree - Umbenennen selbst handlen. AWT, Swing, JavaFX & SWT 2
E Übergebenem JTree Blätter hinzufügen AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
A Swing JTree - Nodes expanden AWT, Swing, JavaFX & SWT 2
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
B JTree AWT, Swing, JavaFX & SWT 9
1 Swing JTree collapse child nodes AWT, Swing, JavaFX & SWT 4
B JTree - sehr individuell AWT, Swing, JavaFX & SWT 3
G Swing JTree - Verbindungslinien entfernen AWT, Swing, JavaFX & SWT 4
A Swing Herausfinden ob bei JTree Klick auf "+"/"-" anahnd x,y AWT, Swing, JavaFX & SWT 2
S Swing JTree und seine Listener... AWT, Swing, JavaFX & SWT 4
L Swing JTree wird nicht selektiert AWT, Swing, JavaFX & SWT 2
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
A JTree aus Pfaden erzeugen AWT, Swing, JavaFX & SWT 3
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
X Datensätze in JTree AWT, Swing, JavaFX & SWT 2
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
E JTree Auswahl AWT, Swing, JavaFX & SWT 2
K JTree width der Treenodes auf 100% AWT, Swing, JavaFX & SWT 6
C JTree LastSelectedPathComponent benutzen? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben