Swing - 最后一个JMenuItem占用JMenuBar

时间:2017-08-01 09:22:02

标签: java swing jmenuitem jmenubar

我发现如果我有JMenuBar,并且它的最后一个元素(最右边的一个)是JMenuItem,它将占用JMenuBar上的所有剩余空白区域,这绝对是不是我们想要的。

想象一下“关于”JMenuItem是JMenuBar上最右边的项目。它应该只占用与其他菜单相同的空间。

请参阅我的SSCCE :(点击菜单并将鼠标悬停在右侧的菜单项上以查看效果)

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;

public class JMenuItemLastOnMenuBar {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createGUI();
            }
        });
    }

    private static void createGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setBounds(0, 0, 300, 300);

        JMenuBar bar = new JMenuBar();
        JMenu menu = new JMenu("Menu 1");
        JMenuItem item1 = new JMenuItem("Item 1");
        menu.add(item1);
        bar.add(menu);

        JMenuItem item2 = new JMenuItem("Item 2") {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(120, 25);
            }
        };
        bar.add(item2);

        frame.setJMenuBar(bar);

        frame.pack();
        frame.setVisible(true);
    }

}

1 个答案:

答案 0 :(得分:2)

您应该覆盖方法getMaximumSize

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;

public class JMenuItemLastOnMenuBar {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createGUI();
            }
        });
    }

    private static void createGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setBounds(0, 0, 300, 300);

        JMenuBar bar = new JMenuBar();
        JMenu menu = new JMenu("Menu 1");
        JMenuItem item1 = new JMenuItem("Item 1");
        menu.add(item1);
        bar.add(menu);

        JMenuItem item2 = new JMenuItem("Item 2") {
            @Override
            public Dimension getMaximumSize() {
                Dimension d1 = super.getPreferredSize();
                Dimension d2 = super.getMaximumSize();
                d2.width = d1.width;
                return d2;
            }
        };
        bar.add(item2);

        frame.setJMenuBar(bar);

        frame.pack();
        frame.setVisible(true);
    }

}