我目前正在尝试自定义JMenuItems的大小以使它们更大。由此:
更像这样:
从外观上看,我有几个选择:
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添加复合边框:
menuItem.setBorder(BorderFactory.createCompoundBorder(menuItem.getBorder(), new EmptyBorder(5,5,5,5)))
4:或以某种方式告诉设置菜单项宽度的外观和感觉 - 我不太懂。
还有其他方法吗?方法1有效,但我认为添加复合边框可能是我应该采用的方式。我想我可以扩展JMenuItem并将边框添加到自定义项(这也允许我投射JCheckBoxMenuItem)?
任何帮助都表示赞赏,并没有真正找到一个明确的答案,并且想知道更一般地定制组件的最佳做法是什么,同时避免整个get / set preferredSize()陷阱。
答案 0 :(得分:1)
我通常会调用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):
间隙较大(值= 80):
答案 1 :(得分:0)
JMenuItem
从AbstractButton
扩展而来setMargin(...)
方法:
menuItem.setMargin( new Insets(...) );
编辑:
一些LAF允许您设置此属性:
UIManager.put("MenuItem.margin", new Insets(...));
查看UIManager Defaults了解详情。
答案 2 :(得分:0)
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);