JMenuItem(または同様のボタンタイプのオブジェクト)をJMenuBarに追加する方法はありますか?
JMenuItemの追加は、JMenuBarのレイアウトではうまく機能せず、ボタンはボタンのように見えます。
ボタンをJMenuItemのように調整する必要がありますか、それともJMenuBarを調整してJMenuItemを正しく表示する必要がありますか?それとも他の何か?
次のコードは camickr のソリューションを実装していますJMenuItem
が、JMenuBar
. それはかなり本物に見え、クリックには反応しますが、ニーモニックには反応しません。
私は JMenuItems アクセラレータ (コードを参照) を与えようとしましたが、それは機能しますが、それは本当に奇妙に見えます。
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);
}
}
JMenuItemは、JMenuBarのレイアウトではうまく機能しません
メニューバーはBoxLayoutを使用して、コンポーネントを最大サイズに拡大しようとします。使用してみてください:
menuItem.setMaximumSize( menuItem.getPreferredSize() );
さらにサポートが必要な場合は、問題を示すSSCCEを投稿してください。
たぶんあなたはあなたのJMenuを忘れています。JMenuItemをJMenuに配置してから、JMenuをJMenuBarに追加する必要があります。
メニューバーを作成するには、次のようなことを行う必要があります。
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);
うん。もしくは簡単な方法で
mb.add(new JMenuItem(closeAction) {
public Dimension getMaximumSize() {
return new Dimension(
super.getPreferredSize().width,
super.getMaximumSize().height);
}
});
クラスファイルを作成しますが、まあ。
ボタンを JMenu のように見せるには、ロールオーバー効果を追加してボタンの境界線を削除するだけです (例として以下のコードを参照してください)。
必要なインポート
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.Dimension;
import java.awt.Color;
コード
JButton tstButton = new JButton(); //Button
tstButton.setText("Test"); //Button Text
tstButton.setOpaque(false); //These remove the button filling and border
tstButton.setContentAreaFilled(false);
tstButton.setBorder(null);
tstButton.setFocusable(false);
tstButton.setRolloverEnabled(true); //Allows the button to detect when mouse is over it
tstButton.getModel().addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent e)
{
ButtonModel model = (ButtonModel) e.getSource();
if(model.isRollover())
{
tstButton.setBackground(Color.RED); //Changes the colour of the button
tstButton.setOpaque(true);
}
else
{
tstButton.setBackground(null);
tstButton.setOpaque(false);
}
}
});
Dimension dBt = new Dimension(75,25); //Sets the size of the button in the JMenuBar
tstButton.setMinimumSize(dBt);
tstButton.setPreferredSize(dBt);
tstButton.setMaximumSize(dBt);
tstButton.setMnemonic('T'); //Allows you to press Alt+T on your keyboard to press the button
tstButton.addActionListener(new ActionListener() //Adds action listener so it can do something
{
public void actionPerformed(ActionEvent e)
{
System.out.println("Button pressed");
}
});
menuBar.add(tstButton); //Adds the button to the JMenuBar
編集
これを行うには、はるかに改善された方法があります
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
}
}
最近、このようなことが起こりました。JMenuItems が 2 つしかない JMenuBar がありました (したがって、JMenu と JMenuItem が混在する環境ではこれを試していないことに注意してください。
最初は、レイアウトを左揃えの FlowLayout に変更することになりましたが、コンポーネント間のスペースが多すぎました。いろいろやってみようとあれこれいじりましたが、とても物足りなかったです。私が最終的にやったのは、JMenuを使用することでしたが、その動作の一部をオーバーライドして、JMenuItemのふりをしました。そのようです:
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);