JMenuItem设置对齐& MAXIMUMSIZE

时间:2017-11-29 09:17:55

标签: java swing

我试图在JMenuBar上创建一个帮助按钮。目前我可以使用此

使其正确对齐
helpItem.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

问题在于它占用了JMenuBar的整个空间,因此您可以基本按下JMenuBar的空白处的任何位置,它将按下该按钮。我通过使用此

覆盖JMenuItem的大小来修复它
    JMenuItem helpItem = new JMenuItem() {
        @Override
        public Dimension getMaximumSize() {
            Dimension d1 = super.getPreferredSize();
            Dimension d2 = super.getMaximumSize();
            d2.width = d1.width;
            return d2;
        }
    };

但是,在我覆盖getMaximumSize之后,setComponentOrientation并没有将JMenuItem对齐到右边。

编辑(当前代码):

private void createMenuBar() {
        JMenuBar newMenuBar = new JMenuBar();
        newMenuBar.setName("");
        JMenu newMenu = new JMenu("Menu");
        JMenuItem updateItem = new JMenuItem("Update");
        JMenuItem aboutMe = new JMenuItem("About");
        JMenuItem exitItem = new JMenuItem("Exit");
        JMenuItem helpItem = new JMenuItem();
        URL iconPath = getClass().getResource("/help.png");
        helpItem.setIcon(new ImageIcon(iconPath));
        addMenuItemActionListeners(updateItem, aboutMe, exitItem, helpItem);
        newMenu.add(updateItem);
        newMenu.add(aboutMe);
        newMenu.add(exitItem);
        newMenuBar.add(newMenu);
        newMenuBar.add(Box.createHorizontalGlue());
        newMenuBar.add(helpItem);
        this.setJMenuBar(newMenuBar);
 }

1 个答案:

答案 0 :(得分:1)

无需手动设置组件大小,避免使用它,因为这是一种不好的做法,可能会破坏您的布局。

如果您只想对齐右侧的帮助菜单,则可以使用Box.createHorizontalGlue方法。

Yuo可以添加您将要使用的所有其他菜单(当然,如果您需要),然后添加胶水,然后添加您想要与右侧对齐的所有其他菜单。

这是一个例子:

enter image description here

这是一个实现上述结果的MCVE:

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.SwingUtilities;
public class GlueMenuBarTest
{
    public static void main (String [] a) {
        SwingUtilities.invokeLater (new Runnable () {
            @Override public void run () {
                createAndShowGUI ();
            }
        });
    }
    private static void createAndShowGUI () {
        JFrame frame = new JFrame ("Test");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setJMenuBar (createGlueMenuBar ());
        frame.setSize (500, 250); // just for convenience, use pack () in a real app.
        frame.setLocationRelativeTo (null);
        frame.setVisible (true);
    }
    private static JMenuBar createGlueMenuBar () {
        JMenuBar menuBar = new JMenuBar ();
        menuBar.add (new JMenu ("File"));
        menuBar.add (new JMenu ("Edit"));
        menuBar.add (new JMenu ("Search"));
        menuBar.add (Box.createHorizontalGlue ());
        menuBar.add (new JMenu ("Help"));
        return menuBar;
    }
}

如果你评论我在左边添加其他菜单的行,它也会起作用。