Frage

Ich möchte eine Toolbar in meiner Anwendung erstellen. Wenn Sie auf dieser Symbolleiste auf eine Schaltfläche klicken, wird ein Menü öffnet sich, wie in Eclipse-Symbolleiste. Ich weiß nicht, wie dies in Swing zu tun. Kann mir bitte jemand helfen? Ich habe versucht, Google aber nichts gefunden.

War es hilfreich?

Lösung

Das ist viel schwieriger in Swing, als es sein muss. Anstatt also Sie darauf hinzuweisen ich Lektionen habe ein voll funktionsfähiges Beispiel erstellt.

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

Andere Tipps

Ich sehe nicht, warum dies schwieriger ist, als es oder sein muss, warum sollten Sie einen Mouselistener verwenden. Die Lösung von Steve McLeod funktioniert, aber wo das Menü angezeigt wird, hängt von wo die Maus geklickt wurde. Warum ein Action nicht nur, wie sie normalerweise für einen JButton verwendet verwenden. Es scheint weder schwerer noch weniger hart.

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

Dies positioniert das Menü über das gleiche wie ein Menü in einem JMenuBar für mich, und die Lage ist konsistent. Man könnte es anders platzieren, indem die x- und y in menu.show Modifizieren ().

Ich denke, es ist das gleiche wie in AWT.

Sie sollten eine Actioncommand auf diese Schaltfläche setzen und wenn sie ausgeführt hat zeigen die Pop-up-Menü entsprechend den Mauskoordinaten.

Im Abschnitt Up Bringing ein Popup-Menü in Wie Menüs verwenden.

Ich bin mir nicht sicher, ob ich Dich richtig verstehe, aber wenn Sie wollen wissen, wie Symbolleiste in Swing überprüfen, um diese

Java Tutorials: Wie Symbolleisten verwenden und das

Java Tutorials: Wie Aktionen verwenden

Hier ist eine einfache und schöne Klasse

eingeben Bild Beschreibung hier

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) {}
        });
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top