Вопрос

Я хочу создать панель инструментов в своем приложении.Если вы нажмете кнопку на этой панели инструментов, откроется меню, точно такое же, как на панели инструментов Eclipse.Я не знаю, как это сделать в Swing.Кто-нибудь может мне помочь, пожалуйста?Я попробовал погуглить, но ничего не нашел.

Это было полезно?

Решение

В Swing это намного сложнее, чем должно быть.Поэтому вместо того, чтобы указывать вам на учебные пособия, я создал полностью рабочий пример.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class ToolbarDemo {

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(600, 400));
        final JToolBar toolBar = new JToolBar();

        //Create the popup menu.
        final JPopupMenu popup = new JPopupMenu();
        popup.add(new JMenuItem(new AbstractAction("Option 1") {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "Option 1 selected");
            }
        }));
        popup.add(new JMenuItem(new AbstractAction("Option 2") {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "Option 2 selected");
            }
        }));

        final JButton button = new JButton("Options");
        button.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
        });
        toolBar.add(button);

        frame.getContentPane().add(toolBar, BorderLayout.NORTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Другие советы

Я не понимаю, почему это сложнее, чем должно быть, или почему вы должны использовать MouseListener.Решение Стива Маклеода работает, но то, где появится меню, зависит от того, где была нажата мышь.Почему бы просто не использовать ActionListener, как обычно используется для JButton.Это не кажется ни сложнее, ни менее трудным.

final JPopupMenu menu = new JPopupMenu();
menu.add(...whatever...);

final JButton button = new JButton();
button.setText("My Menu");
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ev) {
        menu.show(button, button.getBounds().x, button.getBounds().y
           + button.getBounds().height);
    }
});

Это позиционирует меню примерно так же, как меню в JMenuBar для меня, и позиция является последовательной.Вы могли бы разместить его по-другому, изменив x и y в menu.show().

Я думаю, это то же самое, что и в AWT.

Вы должны поместить actionCommand на эту кнопку и, когда она будет выполнена, отобразить всплывающее меню в соответствии с координатами мыши.

Смотрите раздел Вызов всплывающего меню, в Как пользоваться меню.

Я не уверен, что правильно вас понял, но если вы хотите знать, как создать панели инструментов в Swing, проверьте это

Учебные пособия по Java:Как использовать панели инструментов и это

Учебные пособия по Java:Как использовать действия

Вот простой и приятный класс

enter image description here

import javax.swing.JPopupMenu;
import javax.swing.JToggleButton;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class MenuButton extends JToggleButton {

    JPopupMenu popup;

    public MenuButton(String name, JPopupMenu menu) {
        super(name);
        this.popup = menu;
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ev) {
                JToggleButton b = MenuButton.this;
                if (b.isSelected()) {
                    popup.show(b, 0, b.getBounds().height);
                } else {
                    popup.setVisible(false);
                }
            }
        });
        popup.addPopupMenuListener(new PopupMenuListener() {
            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                MenuButton.this.setSelected(false);
            }
            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {}
        });
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top