java - 调整 JMenuItem 的大小?

标签 java swing

我目前正在尝试自定义 JMenuItems 的大小以使其更大。从此:

enter image description here

更多这样的:

enter image description here

从表面上看,我有几个选择:

1:扩展 JMenuItem 并重写 getPreferredSize()。或者我想这样做(这就是上面图像的实现方式):

    private JMenuItem getCustomMenuItem(String s){
    JMenuItem item = new JMenuItem(s){
        @Override
        public Dimension getPreferredSize(){
            return new Dimension(100, 20);
        }
    };
    return item;
}

JMenuItem print = getCustomMenuItem("Print");

但我很确定这是不受欢迎的,因为布局管理器可能不尊重我给出的大小。我可能还必须编写或覆盖其他项目,例如 JCheckBoxMenuItems。

2:我还可以在每个菜单项之间添加水平支柱来处理垂直间距,并在标签两侧使用空格来处理菜单的宽度。但这看起来很笨重,并且当我想要对齐文本和图像时可能会导致问题 menu.add(Box.createVerticalStrut(10))

3:或者我可以为每个菜单项添加复合边框: menuItem.setBorder(BorderFactory.createCompoundBorder(menuItem.getBorder(), new EmptyBorder(5,5,5,5)))

4:或者以某种方式告诉外观和感觉来设置菜单项宽度 - 我不太明白。

还有其他方法可以做到这一点吗?方法 1 有效,但我认为添加复合边框可能是我应该采用的方法。我想我可以扩展 JMenuItem 并将边框添加到自定义项目(这也将允许我转换 JCheckBoxMenuItem)?

感谢任何帮助,但还没有真正找到明确的答案,并且想知道更普遍地自定义组件同时避免整个 get/set PreferredSize() 陷阱的最佳实践是什么。

最佳答案

我通常调用setIconTextGap (int)使菜单项更好看的方法。

示例:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class TestMenuItem
{
    public static void main (String [] a) {
        Locale.setDefault (Locale.ENGLISH);
        SwingUtilities.invokeLater (new Runnable () {
            @Override public void run () {
                try {
                    UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName ());
                    createAndShowGUI ();
                }
                catch (Exception e) {
                    e.printStackTrace ();
                }
            }
        });
    }
    private static void createAndShowGUI () {
        JFrame frame = new JFrame ("Test Menu Item");
        // --- JMenuBar ---
        JMenuBar menuBar = new JMenuBar ();
        JMenu menu = new JMenu ("File");
        menu.add (createMenuItem ("Print", KeyStroke.getKeyStroke (KeyEvent.VK_P, ActionEvent.ALT_MASK)));
        menu.add (createMenuItem ("Exit", KeyStroke.getKeyStroke (KeyEvent.VK_ESCAPE, 0)));
        JMenu anotherMenu = new JMenu ("View");
        JMenuItem longerMenuItem = createMenuItem ("Longer Item", null);
        longerMenuItem.setIconTextGap (80);
        anotherMenu.add (longerMenuItem);
        menuBar.add (menu);
        menuBar.add (anotherMenu);
        // --- Closing frame ---
        frame.setJMenuBar (menuBar);
        // frame.pack (); use pack in a real application !!
        frame.setSize (500, 400); // used just for convenience !!
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo (null);
        frame.setVisible (true);
    }
    public static JMenuItem createMenuItem (String text, KeyStroke keyStroke) {
        JMenuItem menuItem = new JMenuItem (text);
        if (keyStroke != null) menuItem.setAccelerator (keyStroke);
        menuItem.setIconTextGap (40);
        return menuItem;
    }
}

这是结果(值 = 20):

JMenuItem gap test (value = 20)

并且差距较大(值 = 80):

enter image description here

关于java - 调整 JMenuItem 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45088379/

相关文章:

java - 获取两个给定字符串之间的最小可整字符串的长度时如何降低时间复杂度?

java - 带有 GWT RemoteServiceServlet 的 GWTP NullPointerException

java - 如何修改我的代码以仅获取日期的时间部分?

Java:覆盖非继承类的方法

java - Swing:确定拖动结束时包含的对象

java - 无法将 Control-Backspace 映射到 KeyStroke

java - 如何在 XML 属性值中包含 &、<、> 等

Java 尽管存在,但使用 JBOSS 时未找到

java - 如何使用 BoxLayout 让组件与 JPanel 中的顶部对齐?

java - 如何在 JPanel 中创建带边框单元格的 JTable?