Tastatur-Shortcut klappt nicht

stareck

Aktives Mitglied
Hallo zusammen,

ich habe in meinem Menü-Item "Kopieren" den Shortcut Strg+C hinzufügen.
Java:
mniKopieren.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK ));

Allerdings wird der gesetzte ActionListener nicht angesprochen.
Wenn ich allerdings z.B. anstatt
Java:
KeyEvent.VK_C
Java:
KeyEvent.VK_F2
nehme, wird der Actionlistener über Strg+F2 aufgerufen.
Hat jemand eine Idee woran dies liegen kann?
Oder habe ich eine falsche Konstante genommen?
 
Ich denk mal wenn du in einem Textfeld bist wird eben der Shortcut verwendet um in die Zwischenablage zu copieren.
Mach ein kleines KSKB...
 
So hier mal ein Beispiel, Strg+F2 klappt, Strg+C nicht...

Java:
import java.awt.event.*;

import javax.swing.*;

public class ShortcutTest extends JFrame
{
  private JList                 lst;
  
  public ShortcutTest()
  {
    String [] items = {"Eins", "Zwei", "Drei"};
    lst = new JList(items);
    this.add(lst);
    
    JMenuBar menuBar = new JMenuBar();

    JMenu mnuBearbeiten = new JMenu("Bearbeiten");
    JMenuItem mniKopieren = new JMenuItem("Kopieren");
    JMenuItem mniTest = new JMenuItem("Test");
    mnuBearbeiten.add(mniKopieren);
    mnuBearbeiten.add(mniTest);
    menuBar.add(mnuBearbeiten);
    this.setJMenuBar(menuBar);
    
    mniKopieren.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK ));
    mniTest.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_F2, InputEvent.CTRL_DOWN_MASK ));
    
    
    mniKopieren.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Kopieren");
      }
    });
    
    mniTest.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Strg+F2 klappt");
      }
    });
    
    pack();
    setVisible(true);
  }
  
  public static void main(String[] args)
  {
  new ShortcutTest();
  }
}
 
So hier ein Beispiel wos klappt. Oben hab ich schon die Lösung geschrieben warum es in diesem Fall klappt...

Java:
import java.awt.event.*;
 
import javax.swing.*;
 
public class ShortcutTest extends JFrame
{
  
  public ShortcutTest()
  {
    this.add(new JButton("Geht Warum nur?"));
    
    JMenuBar menuBar = new JMenuBar();
 
    JMenu mnuBearbeiten = new JMenu("Bearbeiten");
    JMenuItem mniKopieren = new JMenuItem("Kopieren");
    JMenuItem mniTest = new JMenuItem("Test");
    mnuBearbeiten.add(mniKopieren);
    mnuBearbeiten.add(mniTest);
    menuBar.add(mnuBearbeiten);
    this.setJMenuBar(menuBar);
    
    mniKopieren.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK ));
    mniTest.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_F2, InputEvent.CTRL_DOWN_MASK ));
    
    
    mniKopieren.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Kopieren");
      }
    });
    
    mniTest.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Strg+F2 klappt");
      }
    });
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
  }
  
  public static void main(String[] args)
  {
  new ShortcutTest();
  }
}
 
ja stimmt, wenn ich ein Element meiner JList markiere und Strg+C drücke, habe ich dein Namen des Eintrags in der Zwischenablage...

Kann ich dies denn ausschalten?
 
Öhm gute Frage^^... Weiß net ob der UIManager da ne Lösung hat, ansonsten weiß nur dass du dir die ActionMap von der Liste oder allg. Komponente holen kannst und den entsprechenden Eintrag rauslöschen kannst.
Aber ich weiß nicht ob das Sinn macht und der User begeistert istm wenn man in einem Textfeld oder Liste nichts mehr in die Zwischenablage (vor WIE GEWOHNT) ablegen kann.

Nimm doch eine Combi die es noch nicht gibt Strg+Alt+C oder sowas...

Also ich also user würde auflippen wenn das Textfeld funktionen wie Strg+A+C+V+X net gehen würden...
 
ja ich habe mir einen kleinen Explorer geschrieben, indem ich 2 JList's habe, die linke für die Ordner und die rechte für die Dateien. Wenn ich jetzt einen Ordner oder eine Datei markiere kann ich diese kopieren, allerdings nciht über den Shortcut.

Oder habt ihr einen Tipp für mich, wie ich das sonst realisieren kann.

Die linke JList will ich dann bald auch durch einen JTree ersetzen. Aber da wird das Problem dann ja wahrscheinlich auch auftreten.
 
1. Drag and Drop?
2. Aus der Componente den Action rausnehmen
public void unregisterKeyboardAction(KeyStroke aKeyStroke)
public KeyStroke[] getRegisteredKeyStrokes()

Sonst keine Idee grad...
 
so ich habe jetzt versucht mit der Methode unregisterKeyboardAction(KeyStroke aKeyStroke)
den Shortcut herauszunehmen und anschließend meinen eigenen hinzugefügt.

Allerdings scheint dies nicht zu funktionieren...
 
Hier mal ein kleines Programm..

Java:
import java.awt.event.*;
 
import javax.swing.*;
 
public class ShortcutTest extends JFrame
{
  public ShortcutTest()
  {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    String [] items = {"Eins", "Zwei", "Drei"};
    JList lst = new JList(items);
    lst.unregisterKeyboardAction(KeyStroke.getKeyStroke( KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK ));
        
    this.add(lst);
    
    JMenuBar menuBar = new JMenuBar();
 
    JMenu mnuBearbeiten = new JMenu("Bearbeiten");
    JMenuItem mniKopieren = new JMenuItem("Kopieren");
    mnuBearbeiten.add(mniKopieren);
    menuBar.add(mnuBearbeiten);
    this.setJMenuBar(menuBar);
    
    mniKopieren.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK ));
        
    mniKopieren.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Kopieren");
      }
    });
    pack();
    setVisible(true);
  }
  
  public static void main(String[] args)
  {
  new ShortcutTest();
  }
}
 
So hab es jetzt alleine hingekriegt, wen es interessiert...

Java:
Action kopierenAction = new AbstractAction() 
    {
      private static final long serialVersionUID = 1L;

      public void actionPerformed(ActionEvent e) 
      {
        System.out.println("Kopieren");
      }
    };
    lst.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK), "kopieren");
    lst.getActionMap().put("kopieren", kopierenAction);
    
    mniKopieren.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent e)
      {
        System.out.println("Kopieren");
      }
    });
 

Neue Themen


Zurück
Oben