JMenu, setMnemonic(Char k) bringt keine Wirkung

ExceptionOfExpectation

Bekanntes Mitglied
Hallo,

habe folgendes Problem:

Bei einer Swing-Anwendung habe ich eine JMenuBar-Leiste mit einem JMenu-Objekt. Dieses Objekt erhält eine Kürzel zum Aufruf und eine Hinweisbeschreibung durch TooltipText-Methode:

[CODE lang="java" title="JMenuSwing" highlight="54"]package lection3;

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

public class SwingFrame extends JFrame{
private JTextField jtfStatus;
private JMenuBar menuLeiste;
private JMenu menu;

private String web, save, help, info, system;
String ttNew, ttWeb, ttSave,ttHelp, ttInfo, ttSystem;
String strNew, strWeb, strSave, strHelp, strInfo, strSystem;
JMenu jmDate, jmOpen;
Action actionOpen, actionNew, actionWeb, actionSave, actionHelp, actionInfo, actionSystem;
JMenuItem jmiNew, jmiWeb, jmiSave, jmiHelp, jmiInfo, jmiSystem;

public SwingFrame(){
super("Swing-Frame mit Menue");
setSize(400, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = this.getContentPane();

createMenu();

jtfStatus = new JTextField();
jtfStatus.setBackground(Color.BLACK);
jtfStatus.setForeground(Color.WHITE);
jtfStatus.setEditable(false);

JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(BorderLayout.SOUTH, jtfStatus);
contentPane.add(BorderLayout.CENTER, panel);
setVisible(true);
}

public static void main(String [] args){ new SwingFrame(); }

public JMenuItem createAbstractActionObject(JMenu jMenu, JMenuItem jMenuItem, Action aa, String item, String inhalt){
aa = new AbstractAction(item){
public void actionPerformed(ActionEvent ae){
jtfStatus.setText(inhalt + "...\" gewählt");
}
};

jMenuItem = jMenu.add(aa);
//jMenuItem

return jMenuItem;
}

public void createMenu(){
menuLeiste = new JMenuBar();

jmDate = new JMenu("Datei");
jmDate.setMnemonic('d');
jmDate.setToolTipText("MenuDatei");
jmOpen = new JMenu("\u00d6ffnen");
jmOpen.setMnemonic('O');

actionNew = new AbstractAction("Neu"){
public void actionPerformed(ActionEvent aa){
jtfStatus.setText("\"Datei - Neu...\" gew\u00e4hlt");

}
};
jmiNew = jmDate.add(actionNew);
jmiNew.setToolTipText("Erstelle eine neue Datei");
jmiNew.setMnemonic('n');

jmDate.add(jmOpen);
jmOpen.setToolTipText("\u00e4ffne eine neue Datei");
jmOpen.setMnemonic('n');


ttWeb = "Webseite besuchen";
strWeb = "Web";
web = "\"Datei - zur Web wechseln...\" gew\u00e4hlt";
jmiWeb = createAbstractActionObject(jmOpen,jmiWeb, actionWeb,strWeb, web);
jmiWeb.setMnemonic('w');
jmiWeb.setToolTipText(ttWeb);



ttSave = "Speichere die Datei";
strSave = "Speichern";
save = "\"Datei - Speichern in...\" gew\u00e4hlt";
jmiSave = createAbstractActionObject(jmDate, jmiSave,actionSave,strSave, save);
jmiSave.setMnemonic('S');
jmiSave.setToolTipText(ttSave);

jmDate.addSeparator();





strHelp = "Hilfe";
help = "\"Datei - Hilfe holen...\" gew\u00e4hlt";
jmiHelp = createAbstractActionObject(jmDate, jmiHelp, actionHelp, strHelp, help);
jmiHelp.setMnemonic('h');
jmiHelp.setToolTipText(ttHelp);

ttInfo = "Information aufrufen";
strInfo = "Info";
info = "\"Datei - Informationen holen...\" gew\u00e4hlt";
jmiInfo = createAbstractActionObject(jmDate, jmiInfo, actionInfo, strInfo, info);
jmiInfo.setMnemonic('i');
jmiInfo.setToolTipText(ttInfo);

ttSystem = "Dateieinstellungen prüfen";
strSystem = "DateiSystem";
system = "\"Datei - Dateieinstellung...\" gew\u00e4hlt";
jmiSystem = createAbstractActionObject(jmOpen, jmiSystem,actionSystem, strSystem, system);
jmiSystem.setMnemonic('b');
jmiSystem.setToolTipText(ttSystem);

//jmDate.add(jmiNew);
//jmDate.add(jmOpen);
//jmDate.add(jmiSave);
//jmDate.addSeparator();
//jmDate.add(jmiHelp);
//jmDate.add(jmiInfo);

//jmOpen.add(jmiSystem);
//jmOpen.add(jmiWeb);
//menuLeiste.add(Box.createHorizontalGlue());
//menuLeiste.setMargin(new Insets(0, 30, 0, 20));
menuLeiste.add(jmDate);
this.setJMenuBar(menuLeiste);
}
}[/CODE]

In einem Endergebnis werden die Kürzeln für Jmenu-Objekt und für seine Item-Objekte erstellt, die ich danach kreiere und zu dem JMenu-Objekt zuweise. Beim JMenu-Objekt kann ich den Kürzel wenigsten aufrufen ALT+D, doch für Item-Objekte funktioniert das nicht.
In der Anwendung habe ich zusetzlich Event-Objekte verwendet (Action von AbstractAction), es heißt, dass diese Objekte können auch die Methode setMnemonic() verwenden, doch nichts da. Deshalb habe ich die Action-Objekte zu den JMenuItem-Objekten umgewandelt, aber die Kürzeln werden weder angezeigt, noch funktionieren sie.

Könnt mir Eine weiterhelfen?
 

Anhänge

Zuletzt bearbeitet:
Was genau funktioniert denn nicht wie gewünscht?

Bei mir funktioniert es wie vorgesehen:
a) Bedienung läuft darüber, dass Du erst das Menü öffnest um dann den Buchstaben des Menupunktes zu drücken. Also z.B. ALT-D und dann S für speichern.
b) Ein Problem ist, dass Du das N doppelt vergeben hast. Dadurch wechselt man mit N nur zwischen den Elementen. Daher wäre etwas möglich wie: ALT-D, N (beliebig oft) und dann Auswahl mit Enter.
 
Vielleicht noch der Hinweis: Wenn Du die Absicht hattest, da einen richtigen Shortcut zu erzeugen a.la. Strg-S für Speichern:
Dazu hat das JMenuItem die Methode setAccelerator, dem Du ein KeyStroke mitgeben kannst.

Also um das Beispiel mit Strg-S in Deinem Beispiel abzubilden:
jmiSave.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_DOWN_MASK));

Das kannst Du an der Darstellung dann auch erkennen:
Die erste Variante wird durch ein Unterstreichen des Buchstabens dargestellt. Der Accelerator wird direkt dargestellt hinter dem Text.
 
Was genau funktioniert denn nicht wie gewünscht?

Bei mir funktioniert es wie vorgesehen:
a) Bedienung läuft darüber, dass Du erst das Menü öffnest um dann den Buchstaben des Menupunktes zu drücken. Also z.B. ALT-D und dann S für speichern.
b) Ein Problem ist, dass Du das N doppelt vergeben hast. Dadurch wechselt man mit N nur zwischen den Elementen. Daher wäre etwas möglich wie: ALT-D, N (beliebig oft) und dann Auswahl mit Enter.
Gerade habe ich das überprüft, ja, das stimmt, es funktioniert. Was mir noch fehlt, ist die Kürzel ALT-D in der Hinweisanzeige, die man mit Hilfe von setTooltipText("Hinweis") erstellt. Ungefähr wie im folgenden Bild:
 

Anhänge

  • Tooltip.png
    Tooltip.png
    42,7 KB · Aufrufe: 1
Zuletzt bearbeitet:
Vielleicht noch der Hinweis: Wenn Du die Absicht hattest, da einen richtigen Shortcut zu erzeugen a.la. Strg-S für Speichern:
Dazu hat das JMenuItem die Methode setAccelerator, dem Du ein KeyStroke mitgeben kannst.

Also um das Beispiel mit Strg-S in Deinem Beispiel abzubilden:
jmiSave.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_DOWN_MASK));

Das kannst Du an der Darstellung dann auch erkennen:
Die erste Variante wird durch ein Unterstreichen des Buchstabens dargestellt. Der Accelerator wird direkt dargestellt hinter dem Text.
Das ist schon ein anderes Thema, habe heute darüber gelesen. Um Shortcut geht es nicht
 
Aber da wird doch nur der Shortcut angezeigt oder nicht? Die Mnemonics werden nur durch die Veränderung im Namen (Buchstabe unterstrichen und/oder fett) sichtbar gemacht.
Ne, es wurde hier setMnemonic()-Methode verwendet, also sind das Mnemonics nehme ich an.
Das was du meinst wird zusammen mit den JMenItems angezeigt:

uimenu1.png
 
Die einzigen Standardfunktionen sind Mnemonics und Accelerators und die tun nur das, was Kneitzel gesagt hat.
Ein Tooltip wird nur für die Maus angezeigt, nicht, wenn man etwas per Tastatur selektiert.
Kann sein, dass die Actionmap des Formulars mit ALT + getMnemonic() der Menüs befüllt wurde, um die Tooltips anzuzeigen. Aber Standardfunktion dafür gibt's keine.
 
Die einzigen Standardfunktionen sind Mnemonics und Accelerators und die tun nur das, was Kneitzel gesagt hat.
Ein Tooltip wird nur für die Maus angezeigt, nicht, wenn man etwas per Tastatur selektiert.
Kann sein, dass die Actionmap des Formulars mit ALT + getMnemonic() der Menüs befüllt wurde, um die Tooltips anzuzeigen. Aber Standardfunktion dafür gibt's keine.
Ich habe auch so gedacht am Anfang, dass der Hinweis mit ALT-Key als String Inhalt eingefügt wurde. Im Internet habe ich es nicht gefunden und Ihr wisst das auch nicht. Dann lassen wir es offen...
Wenn ich darüber ir-was herausfinde, lasse ich Euch wissen.
 

Zurück
Oben