JMenu, setMnemonic(Char k) bringt keine Wirkung

ExceptionOfExpectation

Aktives 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

  • JmenuSwing.java
    3,8 KB · Aufrufe: 1
Zuletzt bearbeitet:
K

kneitzel

Gast
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.
 
K

kneitzel

Gast
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.
 

ExceptionOfExpectation

Aktives Mitglied
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:

ExceptionOfExpectation

Aktives Mitglied
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
 

ExceptionOfExpectation

Aktives Mitglied
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
 

Neumi5694

Top Contributor
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.
 

ExceptionOfExpectation

Aktives Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
D Mit Jmenu neue JFrame öffnen AWT, Swing, JavaFX & SWT 2
MaxG. Swing JMenu einen Listener Hinzufügen AWT, Swing, JavaFX & SWT 25
Y Backgroundcolor JMenu AWT, Swing, JavaFX & SWT 2
D Merkwürdiges Verhalten vom JMenu AWT, Swing, JavaFX & SWT 4
X JMenu Menu-Bar ausrichtung ändern im Programm AWT, Swing, JavaFX & SWT 0
S AWT JTextFields durch Array im JMenu erzeugen? AWT, Swing, JavaFX & SWT 19
E JMenu erscheint nach RDP-Verbindung auf falschem Desktop AWT, Swing, JavaFX & SWT 1
S Swing JMenu löscht auf panel gezeichnetes AWT, Swing, JavaFX & SWT 3
llabusch Prüfen ob JMenu leer ist & löschen AWT, Swing, JavaFX & SWT 1
3 Swing Vertikaler Separator zwischen JMenu's AWT, Swing, JavaFX & SWT 2
S JMenu unter JPanel versteckt AWT, Swing, JavaFX & SWT 5
S jMenu wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
T JMenu reagiert auf F-Taste AWT, Swing, JavaFX & SWT 6
M JMenuBar, JMenu, JMenuItem wird nicht angezeigt AWT, Swing, JavaFX & SWT 16
Jagson Mit JMenu auf jDialog zurück? Wie? AWT, Swing, JavaFX & SWT 8
Kenan89 JMenu Fragen AWT, Swing, JavaFX & SWT 5
B Swing JMenu zwischen anderen Componenten AWT, Swing, JavaFX & SWT 4
R JMenu aus Ordnern AWT, Swing, JavaFX & SWT 4
P JMenu aus Dateistruktur AWT, Swing, JavaFX & SWT 2
I JMenu AWT, Swing, JavaFX & SWT 5
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
frankred Swing JMenu verschwindet nicht beim klicken ausserhalb des JMenu! AWT, Swing, JavaFX & SWT 4
F JMenu auf JPanel AWT, Swing, JavaFX & SWT 5
E Swing JMenu in GUI einbinden AWT, Swing, JavaFX & SWT 5
S Probleme mit JMenu und JMenuItem AWT, Swing, JavaFX & SWT 2
E JMenu übersetzen AWT, Swing, JavaFX & SWT 9
W JMenu wird vom JPanel ständig überzeichnet... Abhilfe? AWT, Swing, JavaFX & SWT 3
P JMenu-Erweiterung in externer Datei AWT, Swing, JavaFX & SWT 5
T Swing JMenu als Button behandeln AWT, Swing, JavaFX & SWT 4
T Swing jMenu AWT, Swing, JavaFX & SWT 6
R JMenu in JToolBar AWT, Swing, JavaFX & SWT 6
T Swing JMenu falsch positioniert AWT, Swing, JavaFX & SWT 2
M JMenu teilweise unter einer JComponent AWT, Swing, JavaFX & SWT 4
Developer_X Swing JMenu Bug gefunden AWT, Swing, JavaFX & SWT 5
D Swing JMenu wieder schließen lassen AWT, Swing, JavaFX & SWT 7
E Swing Einfache Frage zu JMenu AWT, Swing, JavaFX & SWT 4
hdi Welche Klasse + Listener für JMenu AWT, Swing, JavaFX & SWT 2
A JMenu Bug? AWT, Swing, JavaFX & SWT 12
J JMenu unterschiedliche Background einstellen AWT, Swing, JavaFX & SWT 5
C JMenu bzw. JButton mit URL versehen AWT, Swing, JavaFX & SWT 2
G ActionListener auf JMenu funktioniert nicht AWT, Swing, JavaFX & SWT 4
X JMenu AWT, Swing, JavaFX & SWT 2
D Abfrageproblem bei JMenu mit Icon AWT, Swing, JavaFX & SWT 2
Ernesto95 Programmabsturz beim Einbinden eines JMenu AWT, Swing, JavaFX & SWT 18
P jMenu ohne Menubar - Jigloo zeigts AWT, Swing, JavaFX & SWT 2
S JMenu und ActionListener per Schleife erzeugen AWT, Swing, JavaFX & SWT 3
G Scrollbares JMenu AWT, Swing, JavaFX & SWT 4
A Bei Klick auf disabled JMenuItem JMenu nicht schließen AWT, Swing, JavaFX & SWT 2
G JMenu problem mit der Breite von einer JCheckBox AWT, Swing, JavaFX & SWT 2
V JMenu und die Tabs von JTabbedFrame sind auf einmal schwarz AWT, Swing, JavaFX & SWT 3
H JMenu wird leider unterhalb! der CanvasFläche dargestellt AWT, Swing, JavaFX & SWT 5
X Swing: Bilder überlagern JMenu AWT, Swing, JavaFX & SWT 4
T ImageIcon als Seperator im Jmenu AWT, Swing, JavaFX & SWT 8
padde479 JMenu mnemonic AWT, Swing, JavaFX & SWT 3
N JMenu und JPanel AWT, Swing, JavaFX & SWT 5
P JMenu / JMenuItem durch Rekursion Icons entfernen AWT, Swing, JavaFX & SWT 4
B 1 JMenu in Mehrere JMenus AWT, Swing, JavaFX & SWT 2
G Canvas, JMenu, und BufferStrategy AWT, Swing, JavaFX & SWT 2
D JMenu -> Accelerator AWT, Swing, JavaFX & SWT 2
I JMenu(Item) und FocusListener AWT, Swing, JavaFX & SWT 3
T JMenu/JMenuItem Component auf der geaddet wurde AWT, Swing, JavaFX & SWT 16
G JMenu About ohne JMenuItem AWT, Swing, JavaFX & SWT 11
R JMenu + Farbe von Hintergrund AWT, Swing, JavaFX & SWT 2
M JMenu verschwindet unter ScrollPane AWT, Swing, JavaFX & SWT 3
D Schriftfarbe ändern (JFrame, JMenu etc) AWT, Swing, JavaFX & SWT 3
K JMenu wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
I JMenu wird nicht dargestellt AWT, Swing, JavaFX & SWT 12
H JMenu soll "offen bleiben" AWT, Swing, JavaFX & SWT 3
M JMenuBar - JMenu mit Tastenkombination aufrufen / anzeigen AWT, Swing, JavaFX & SWT 8
redztripe Haken in JMenu setzen? AWT, Swing, JavaFX & SWT 8
G Icon zu JMenu AWT, Swing, JavaFX & SWT 3
M JMenu auf JComponent? AWT, Swing, JavaFX & SWT 10
G JMenu - neuer Frame AWT, Swing, JavaFX & SWT 2
X Verschwinden des JMenu unterbinden AWT, Swing, JavaFX & SWT 3
R JMenu copy Focus-Problem AWT, Swing, JavaFX & SWT 2
E JTextArea überlagert JMenu AWT, Swing, JavaFX & SWT 2
D JMenu spinnt AWT, Swing, JavaFX & SWT 7
Z JMenu und JMenuItem: MouseOver-Farbe ändern AWT, Swing, JavaFX & SWT 9
B Alle jMenu und JMenuItem in einem Array AWT, Swing, JavaFX & SWT 4
R JMenu einträge werden überdeckt AWT, Swing, JavaFX & SWT 3
T JMenu erscheint nicht richtig AWT, Swing, JavaFX & SWT 6
G JMenu Info-Fenster ganz Rechts AWT, Swing, JavaFX & SWT 5
H JMenu zuklappen AWT, Swing, JavaFX & SWT 7
K JMenu Aktionen AWT, Swing, JavaFX & SWT 3
padde479 setMnemonic AWT, Swing, JavaFX & SWT 3
L JavaFX ASCII Zeichen /char von KeyEvent erhalten AWT, Swing, JavaFX & SWT 5
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
T Zeichen/char in Bild umwandeln und darstellen AWT, Swing, JavaFX & SWT 10
K Action.MNEMONIC mit char belegen. AWT, Swing, JavaFX & SWT 2
M JPasswordfield.getpassword() char[] nicht codiert auslesen? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben