Y a-t-il un moyen d'ajouter un objet jmenuitem (ou un objet de type bouton similaire) à un jmenubar? p>
Ajout d'un jmenuitem ne joue pas bien avec la mise en page d'un jmenubar et des boutons semblent trop de boutons. P>
Devrions-nous modifier le bouton pour ressembler à un jmenuitem ou modifier le jmenubar pour afficher correctement le jmenuitem? Ou autre chose d'autre? P>
8 Réponses :
jmenuitem ne joue pas bien avec le Disposition d'un jmenubar p>
Une menu-ménagère utilise un boxlayout qui essaiera de scrocher le composant à sa taille maximale. Essayez d'utiliser: p>
xxx pré> Si vous avez besoin de plus d'aide Poster votre SSCCE montrant le problème. p> blockQuote>
N'a pas travaillé pour moi, un espace blanc à gauche (où jmenuitem code> s espace de réserve pour icônes) est resté.
Peut-être que vous oubliez votre jmenu. Vous devez mettre le jmenuitem dans un jmenu, puis vous ajoutez le jmenu au jmenubar.
Pour créer une barre de menu, vous devez faire quelque chose comme ce qui suit: P>
JMenuBar myBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem newFileMenuItem = new JMenuItem("New");
newFileMenuItem.addActionListener(new ActionListerner() { ... Define Action Handler here... });
fileMenu.add(newFileMenuItem);
myBar.add(fileMenu);
Non, je n'oublie rien. Je suis bien conscient de la structure de Jmenubar, JMENU, JMENUITEM. Ma question était de savoir s'il y avait une façon de «sauter» JMENU et ajoutez un jmenuitem directement à un jmenubar. Merci quand même.
Je ne crois pas qu'il y ait, cela ressemble à ce que vous recherchez dans ce cas est un jtoolbar: Java.sun.com/javase/6/docs/api et non un jmenubar.
Essayez-vous de faire quelque chose comme les panneaux utilitaires Linux où vous pouvez avoir des liens d'alias avec des menus?
Le code suivant implémente la solution de CamickR, bien que je voudrais avoir la même chose après avoir vu la manière par défaut J'ai essayé de donner aux accélérateurs Jmenuitems (voir code) et cela fonctionne mais qui a l'air vraiment étrange. P> jmenuitem code> s est rendue dans un jmenubar code>. Il semble raisonnablement authentique et répond aux clics, mais pas au mnémonique. public class TheDude19 extends JFrame {
private class Action1 extends AbstractAction {
private Action1() {
super("Action1");
putValue(MNEMONIC_KEY, (int) '1');
// putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK));
}
public void actionPerformed(ActionEvent arg0) {
System.out.println("Action 1!");
}
}
private class Action2 extends AbstractAction {
private Action2() {
super("Action2");
putValue(MNEMONIC_KEY, (int) '2');
}
public void actionPerformed(ActionEvent arg0) {
System.out.println("Action 2!");
}
}
private class NarrowMenuItem extends JMenuItem {
public NarrowMenuItem(Action a) {
super(a);
}
public Dimension getMaximumSize() {
return new Dimension(super.getPreferredSize().width, super.getMaximumSize().height);
}
}
public TheDude19() {
JMenuItem menu1 = new NarrowMenuItem(new Action1());
JMenuItem menu2 = new NarrowMenuItem(new Action2());
JMenuBar mb = new JMenuBar();
mb.add(menu1);
mb.add(menu2);
add(mb, BorderLayout.NORTH);
setSize(400, 300);
}
public static void main(String[] args) {
(new TheDude19()).setVisible(true);
}
}
J'ai eu quelque chose comme ça que cela se produisait récemment, j'avais un jmenubar qui n'avait que 2 jmenuitems (alors noter que je n'ai pas essayé cela dans un environnement mixte JMENU et JMENUITEM.
Au début, j'ai fini de changer la mise en page une flowlayout avec un alignement gauche, mais qui a laissé trop d'espace entre les composants. Je me suis malade avec tentative de faire diverses choses, mais était très insatisfaite. Ce que j'ai fini par faire était d'utiliser un jmenu, mais en outre comportements de sorte qu'il prétendait être un jmenuitem. Comme ça? P>
JMenuBar mainMenuBar = new JMenuBar();
final JMenu quitMenuItem = new JMenu("Quit");
quitMenuItem.addMenuListener(new MenuListener() {
public void menuSelected(MenuEvent e) {
System.exit(0);
}
public void menuDeselected(MenuEvent e) {}
public void menuCanceled(MenuEvent e) {}
});
quitMenuItem.setPopupMenuVisible(false);
final JMenu aboutMenuItem = new JMenu("About");
aboutMenuItem.addMenuListener(new MenuListener() {
public void menuSelected(MenuEvent e) {
JOptionPane.showMessageDialog(MainFrame.this, "Assignment 3 With Swing UI. Author: T.Byrne", "About", JOptionPane.INFORMATION_MESSAGE);
aboutMenuItem.setSelected(false);//otherwise it will still be selected after the dialog box.
}
public void menuDeselected(MenuEvent e) {}
public void menuCanceled(MenuEvent e) {}
});
aboutMenuItem.setPopupMenuVisible(false);
mainMenuBar.add(quitMenuItem);
mainMenuBar.add(aboutMenuItem);
this.setJMenuBar(mainMenuBar);
Le problème est que l'événement menusélecté peut être tiré sans cliquer sur le menu. Vous n'avez pas remarqué cela parce que vous n'avez pas de menus réguliers dans votre barre de menus. Si vous cliquez sur un menu régulier pour développer son menu contextuel, puis passez à un autre menu, celui-ci sera automatiquement sélectionné et il est développé. Si vous passez sur votre menu spécial, vous quitterez votre application simplement en volant votre souris dessus, sans cliquer dessus.
yup. Ou faites-le la voie facile Cela crée un fichier de classe, mais meh. P> p>
Il suffit de modifier le jbutton.
button= new JButton("MenuItem");
button.setOpaque(true);
button.setContentAreaFilled(false);
button.setBorderPainted(false);
button.setFocusable(false);
button.addActionListener(new buttonHandler());
menuBar.add(button);
Pour obtenir le bouton pour ressembler à un jmenu, ajoutez simplement un effet de roulement et retirez la bordure du bouton (voir le code ci-dessous par exemple)
Importations requises P>
JButton tstButton = new JButton();
tstButton.setVisible(false);
tstButton.addActionListener(new CustomActionListener());
menuBar.add(tstButton);
JMenu menuButton = new JMenu();
addHotKey(menuButton, "shift C", 'm', "Menu Button","pressed");
menuButton.addMouseListener(new CustomMouseListener());
menuButton.addMenuKeyListener(new CustomKeyListener());
menuBar.add(menuButton);
public void addHotKey(JMenu J, String s, char c, String S, String key)
{
Action buttonAction = new AbstractAction(S)
{
@Override
public void actionPerformed(ActionEvent evt)
{
clcikComponent(tstButton);
}
};
J.setAction(buttonAction);
buttonAction.putValue(Action.MNEMONIC_KEY, KeyEvent.getExtendedKeyCodeForChar(c));
J.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(s), key);
J.getActionMap().put(key, buttonAction);
}
class CustomMouseListener implements MouseListener
{
public void mouseClicked(MouseEvent e)
{
clcikComponent(m_Invisible);
}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
}
class CustomKeyListener implements MenuKeyListener
{
@Override
public void menuKeyTyped(MenuKeyEvent e)
{
char c = e.getKeyChar();
if(c==KeyEvent.VK_ENTER)
{
if(m_code.isSelected())
{
clcikComponent(m_Invisible);
}
}
}
@Override
public void menuKeyPressed(MenuKeyEvent e){}
@Override
public void menuKeyReleased(MenuKeyEvent e){}
}
public void clcikComponent(JButton comp)
{
comp.doClick();
}
class CustomActionListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
//Makes Button Perform Action
}
}
Obtenir l'interface utilisateur et le code des deux pour bien paraître a pris un certain temps. Nous avons fini par attacher une adaptateur de souris au composant sous-jacent de JMENU:
JMenu selectData = new JMenu("Select data...");
selectData.getComponent().addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
// Our code to open a window for choosing data series here...
// [...]
}
});
menuBar.add(selectData);