首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整JMenuItem的大小?

调整JMenuItem的大小?
EN

Stack Overflow用户
提问于 2017-07-14 02:24:51
回答 3查看 1.6K关注 0票数 0

我目前正在尝试定制我的JMenuItems的大小,让它们变得更大。从这个开始:

更像这样:

从外观上看,我有几个选择:

1:扩展JMenuItem并覆盖getPreferredSize()。或者我猜这样做(这就是上面的图像是如何实现的):

代码语言:javascript
复制
    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添加一个复合边框:menuItem.setBorder(BorderFactory.createCompoundBorder(menuItem.getBorder(), new EmptyBorder(5,5,5,5)))

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

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

感谢任何帮助,我还没有找到关于这个问题的明确答案,并且想知道更普遍地定制组件的最佳实践是什么,同时避免整个get/set preferredSize()陷阱。

EN

回答 3

Stack Overflow用户

发布于 2017-07-14 04:34:56

我通常会调用setIconTextGap (int)方法来给菜单项更好的外观。

示例:

代码语言:javascript
复制
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):

并且具有较大的间隙(值= 80):

票数 1
EN

Stack Overflow用户

发布于 2017-07-14 02:28:43

JMenuItem是从具有setMargin(...)方法的AbstractButton扩展而来的:

代码语言:javascript
复制
menuItem.setMargin( new Insets(...) );

编辑:

一些LAF允许您设置此属性:

代码语言:javascript
复制
UIManager.put("MenuItem.margin", new Insets(...));

有关更多信息,请查看UIManager Defaults

票数 0
EN

Stack Overflow用户

发布于 2017-07-14 02:31:11

代码语言:javascript
复制
JMenuItem item = new JMenuItem("FILE");
item.add(new JButton("FILE BUTTON"));
item.setLayout(new FlowLayout()); // set FlowLayout for item
item.setPreferredSize(new Dimension(200, 100));//set size here
menu.add(item);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45088379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档