创建菜单栏及其项目时我没有遇到任何问题。但现在,当我得到一个问题如何使菜单项显示为列&像行的桌子形状,我真的不知道。
目标是使用java创建这种菜单项。 Check this link.
现在,我只是认为我应该使用jpanel作为菜单项,然后应用flowlayout然后添加许多jlabel(s)尽可能作为网格中的menuitem。但不是最糟糕的吗? 创建菜单项的最佳方法是什么,例如上面链接中的图像预览?
我试过google,但没有找到相关案例。 CMIIW。
答案 0 :(得分:6)
JMenu
实例的弹出菜单是标准容器,因此您可以随意添加它。它有一个默认布局,但您可以更改它。
你的模型中的东西是由这段代码创建的:
import javax.swing.*;
import java.awt.*;
public class Test {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Menu test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(600, 400));
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Test");
JPopupMenu popupMenu = menu.getPopupMenu();
popupMenu.setLayout(new GridLayout(5, 5));
for (int r = 0; r < 5; r++) {
for (int c = 0; c < 5; c++) {
popupMenu.add(new JMenuItem("(" + (r + 1) + ", " + (c + 1) + ")"));
}
}
menuBar.add(menu);
frame.setJMenuBar(menuBar);
frame.setVisible(true);
}
});
}
}
答案 1 :(得分:2)
我还没有看到像这样的任何现成组件。所以我认为你是独立的。
我看到两种可能性:
JMenuItem是一个JComponent,因此您可以向其添加其他组件。您可能希望使用某种基于网格的布局并为数字添加按钮或标签。
实现您自己的JMenuItem,它显示您的网格组件而不是正常的JPopupMenu
在任何情况下都要查看JMenu(Item)的源代码,以了解这些组件的工作原理。
答案 2 :(得分:1)
最简单的解决方案是设置JMenu的JPopupMenu的布局,然后像往常一样添加项目。没有必要创建一个子类。
示例:
import javax.swing.*;
import java.awt.*;
public class menu {
public static void main(String ... args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("A regular menu");
menu.add(new JMenuItem("Menu item"));
JMenu gridMenu = new JMenu("Menu with grid");
// This does the trick:
gridMenu.getPopupMenu().setLayout(new GridLayout(2, 2));
gridMenu.add("Top left");
gridMenu.add("Top right");
gridMenu.add("Bottom left");
gridMenu.add("Bottom right");
menu.add(gridMenu);
menuBar.add(menu);
JFrame frame = new JFrame("Menus");
frame.setJMenuBar(menuBar);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
}