有没有办法将JMenuItem(或类似的按钮类型对象)添加到JMenuBar?
添加JMenuItem与JMenuBar的布局不兼容,按钮看起来太像按钮了。
我们是否应该将按钮调整为看起来像JMenuItem或调整JMenuBar以正确显示JMenuItem?还是别的什么呢?
答案 0 :(得分:3)
下面的代码实现了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);
}
}
答案 1 :(得分:2)
JMenuItem并不适合 JMenuBar的布局
菜单栏使用BoxLayout,它会尝试将组件拉伸到最大尺寸。尝试使用:
menuItem.setMaximumSize( menuItem.getPreferredSize() );
如果您需要更多帮助,请发布显示问题的SSCCE。
答案 2 :(得分:1)
只需调整JButton。
button= new JButton("MenuItem");
button.setOpaque(true);
button.setContentAreaFilled(false);
button.setBorderPainted(false);
button.setFocusable(false);
button.addActionListener(new buttonHandler());
menuBar.add(button);
setContentAreaFilled
让它透明,
setBorderPainted
摆脱边界,
setFocusable
摆脱了文本周围的微小边界。
答案 3 :(得分:0)
也许你忘了你的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);
答案 4 :(得分:0)
我最近发生了这样的事情我有一个只有2个JMenuItems的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);
答案 5 :(得分:0)
烨。或者这么简单
mb.add(new JMenuItem(closeAction) {
public Dimension getMaximumSize() {
return new Dimension(
super.getPreferredSize().width,
super.getMaximumSize().height);
}
});
它创建了一个类文件,但是meh。
答案 6 :(得分:0)
要使按钮看起来像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
}
}
答案 7 :(得分:0)
使UI和代码看起来都不错需要花费一段时间。我们最终在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);
我想我们也要添加一个KeyAdapter
,但还没有。