Java Swing: как выровнять пункты меню по строкам и столбцам? - PullRequest
2 голосов
/ 27 октября 2011

У меня нет проблем при создании строки меню и ее пункта. Но теперь, когда у меня возникает вопрос, как сделать пункты меню в виде столбцов и строк, похожих на таблицы, я действительно об этом не знаю.

Целью является создание такого рода пунктов меню с использованием Java. Проверьте эту ссылку.

И прямо сейчас, я просто думаю, что я должен использовать jpanel в качестве пункта меню, а затем применить разметку потока и затем добавить много jlabel (s), как я мог бы в качестве пунктов меню внутри сетки. Но не хуже ли? Как лучше всего создавать такие пункты меню, как предварительный просмотр изображения по вышеуказанным ссылкам?

Я попробовал Google, но не нашел связанных случаев. CMIIW.

Ответы [ 3 ]

6 голосов
/ 27 октября 2011

Всплывающее меню экземпляра 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);
            }
        });
    }

}
2 голосов
/ 27 октября 2011

Я не видел готового компонента для чего-либо подобного.Поэтому я думаю, что вы по своему усмотрению.

Я вижу две возможности:

  1. JMenuItem - это JComponent, поэтому вы можете добавлять в него другие компоненты.Возможно, вы захотите использовать какую-то сетку и добавить кнопки или метки для чисел.

  2. Реализуйте свой собственный JMenuItem, который отображает ваш компонент сетки вместо обычного JPopupMenu

В любом случае взгляните на исходный код JMenu(Элемент), чтобы понять, как работают эти компоненты.

1 голос
/ 27 октября 2011

Самое простое решение - установить макет JPopupMenu от JMenu, а затем добавить элементы, как обычно.Нет необходимости создавать подкласс.

Пример:

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);
                }
            });
    }
}
...