Создать меню по нажатию кнопки в Java - PullRequest
3 голосов
/ 24 апреля 2011

Для проекта мы хотим создать кнопку, которая при щелчке создаст крошечное меню (способ работы аналогичен выпадающему меню кнопки «Назад» в Firefox, хотя активировать можно простым щелчком левой кнопки мыши). Единственным реальным ограничением является то, что он должен быть на Java (желательно качаться, если возможно). Итак, есть идеи, примеры, коды о том, как это сделать?

Ответы [ 5 ]

11 голосов
/ 24 апреля 2011

Используйте JPopupMenu. Е.Г.

PopUpMenuDemo.java

import java.awt.event.*;
import javax.swing.*;

class PopUpMenuDemo {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                final JButton b = new JButton("Pop Up");

                final JPopupMenu menu = new JPopupMenu("Menu");
                menu.add("A");
                menu.add("B");
                menu.add("C");
                b.addActionListener( new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        menu.show(b, b.getWidth()/2, b.getHeight()/2);
                    }
                } );
                JOptionPane.showMessageDialog(null,b);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

Скриншот

enter image description here

2 голосов
/ 26 мая 2011

Это код для menuButton, он выглядит как кнопка, и при нажатии на нее появляется меню. Вы можете настроить его, добавив значок изображения в меню и методами:

setFocusable(false);
setBorderPainted(false); 
setOpaque(false); 

Если вы хотите получить его как FireFox, установите значок для меню и вызовите вышеуказанные методы, а затем установите значок ролловера, выбранный значок и значок ролловера.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class menuButton extends JFrame
{    
    JMenuBar fileMenuBar,editMenuBar;
    JMenu fileMenu,editMenu;
    JMenuItem newFile,open,save,saveas,exit;
    JMenuItem cut,copy,paste,undo,redo;

    public menuButton()
    {
        setTitle("menu Button");    
        setSize(500,500);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

        fileMenuBar=new JMenuBar();    
        editMenuBar=new JMenuBar();
        fileMenu=new JMenu("File");
        editMenu=new JMenu("Edit");
        newFile=new JMenuItem("New");
        newFile.setAccelerator(KeyStroke.getKeyStroke('N',InputEvent.CTRL_MASK));
        open=new JMenuItem("Open");
        open.setAccelerator(KeyStroke.getKeyStroke('O',InputEvent.CTRL_MASK));
        save=new JMenuItem("Save");
        save.setAccelerator(KeyStroke.getKeyStroke('S',InputEvent.CTRL_MASK));
        saveas=new JMenuItem("Save As");
        saveas.setAccelerator(KeyStroke.getKeyStroke('A',InputEvent.CTRL_MASK));
        exit=new JMenuItem("Exit");
        exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK));
        cut=new JMenuItem("Cut");
        cut.setAccelerator(KeyStroke.getKeyStroke('X',InputEvent.CTRL_MASK));
        copy=new JMenuItem("Copy");
        copy.setAccelerator(KeyStroke.getKeyStroke('C',InputEvent.CTRL_MASK));
        paste=new JMenuItem("Paste");
        paste.setAccelerator(KeyStroke.getKeyStroke('V',InputEvent.CTRL_MASK));
        undo=new JMenuItem("Undo");
        undo.setAccelerator(KeyStroke.getKeyStroke('Z',InputEvent.CTRL_MASK));
        redo=new JMenuItem("Redo");
        redo.setAccelerator(KeyStroke.getKeyStroke('R',InputEvent.CTRL_MASK));
        editMenu.add(cut);
        editMenu.add(copy);
        editMenu.add(paste);
        editMenu.addSeparator();
        editMenu.add(undo);
        editMenu.add(redo);    
        fileMenu.add(newFile);
        fileMenu.add(open);
        fileMenu.add(save);
        fileMenu.add(saveas);
        fileMenu.add(exit);
        fileMenuBar.add(fileMenu);
        editMenuBar.add(editMenu);
        add(fileMenuBar);        
        add(editMenuBar);
    }

    public static void main(String args[])
    {
        new menuButton();
    }
}
2 голосов
/ 25 апреля 2011

Я бы, наверное, сделал это так:

    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    JButton btnClickMe = new JButton("Click me");
    btnClickMe.setBounds(10, 30, 89, 23);
    frame.getContentPane().add(btnClickMe);

    final JPopupMenu menu = new JPopupMenu();

    JMenuItem item1 = new JMenuItem("Item1");
    JMenuItem item2 = new JMenuItem("Item2");
    JMenuItem item3 = new JMenuItem("Item3");

    menu.add(item1);
    menu.add(item2);
    menu.add(item3);

    btnClickMe.addMouseListener(new MouseAdapter() {
        public void mouseReleased(MouseEvent e){
            if ( e.getButton() == 1 ){ // 1-left, 2-middle, 3-right button
                menu.show(e.getComponent(), e.getX(), e.getY());
            }
        }
    });
1 голос
/ 24 апреля 2011

видите, это может помочь вам

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

public class GUI implements ActionListener, MouseListener, MouseMotionListener, KeyListener {

    private final BufferedImage offscreenImage; // double buffered image
    private final BufferedImage onscreenImage;  // double buffered image
    private final Graphics2D offscreen;
    private final Graphics2D onscreen;
    private JFrame frame;                       // the top-level component
    private JPanel center = new JPanel();       // center panel

    // create a GUI with a menu, some buttons, and a drawing window of size width-by-height
    public GUI(int width, int height) {
        offscreenImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        onscreenImage  = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        offscreen = (Graphics2D) offscreenImage.getGraphics();
        onscreen  = (Graphics2D) onscreenImage.getGraphics();

        // the drawing panel
        ImageIcon icon = new ImageIcon(onscreenImage);
        JLabel draw = new JLabel(icon);
        draw.addMouseListener(this);
        draw.addMouseMotionListener(this);

        // label cannot get keyboard focus
        center.add(draw);
        center.addKeyListener(this);

        // west panel of buttons
        JPanel west = new JPanel();
        west.setLayout(new BoxLayout(west, BoxLayout.PAGE_AXIS));
        JButton button1 = new JButton("button 1");
        JButton button2 = new JButton("button 2");
        JButton button3 = new JButton("button 3");
        JButton button4 = new JButton("button 4");
        button1.addActionListener(this);
        button2.addActionListener(this);
        button3.addActionListener(this);
        button4.addActionListener(this);
        button1.setToolTipText("Click me");
        west.add(button1);
        west.add(button2);
        west.add(button3);
        west.add(button4);

        // menu
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("File");
        menuBar.add(menu);
        JMenuItem menuSave = new JMenuItem(" Save...   ");
        menuSave.addActionListener(this);
        menuSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
        menu.add(menuSave);

        // setup the frame and add components
        frame = new JFrame();

        frame.setJMenuBar(menuBar);
        frame.add(west,   BorderLayout.WEST);
        frame.add(center, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        frame.pack();

        // give the focus to the center panel
        center.requestFocusInWindow();

        frame.setVisible(true);
    }


    // draw picture (gif, jpg, or png) centered on (x, y)
    public void picture(int x, int y, String filename) {
        ImageIcon icon = new ImageIcon(filename);
        Image image = icon.getImage();
        offscreen.drawImage(image, x, y, null);
        show();
    }


    // display the drawing canvas on the screen
    public void show() {
        onscreen.drawImage(offscreenImage, 0, 0, null);
        frame.repaint();
    }



   /*************************************************************************
    *  Event callbacks
    *************************************************************************/

    // for buttons and menus
    public void actionPerformed(ActionEvent e) {
        Object cmd = e.getActionCommand();
        if      (cmd.equals(" Save...   ")) System.out.println("File -> Save");
        else if (cmd.equals("button 1"))    System.out.println("Button 1 pressed");
        else if (cmd.equals("button 2"))    System.out.println("Button 2 pressed");
        else if (cmd.equals("button 3"))    System.out.println("Button 3 pressed");
        else if (cmd.equals("button 4"))    System.out.println("Button 4 pressed");
        else                                System.out.println("Unknown action");

        // don't hog the keyboard focus
        center.requestFocusInWindow();
    }

    // for the mouse
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        System.out.println("Mouse pressed at " + x + ", " + y);
        offscreen.setColor(Color.BLUE);
        offscreen.fillOval(x-3, y-3, 6, 6);
        show();
    }

    public void mouseClicked (MouseEvent e) { }
    public void mouseReleased(MouseEvent e) { }
    public void mouseEntered (MouseEvent e) { }
    public void mouseExited  (MouseEvent e) { }
    public void mouseDragged (MouseEvent e) { }
    public void mouseMoved   (MouseEvent e) { }


    // for the keyboard
    public void keyPressed (KeyEvent e) { }
    public void keyReleased(KeyEvent e) { }

    public void keyTyped(KeyEvent e) {
        System.out.println("Key = '" + e.getKeyChar() + "'");
    }

    // test client
    public static void main(String[] args) {
        GUI gui = new GUI(800, 471);
        gui.picture(0, 0, "map.png");
        gui.show();
    }

}

enter image description here enter image description here

0 голосов
/ 04 января 2018

Если вам нравятся меньшие строки кода в вашем коде, попробуйте следующий код:

Внутри ваших кнопок actionPerformed:

  private void yourButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               

            final JPopupMenu yourMenu = new JPopupMenu("Settings");
            menu.add("Name");
            menu.add("Id");
            menu.add(new Button()); // can even add buttons and other components as well.
            menu.show(yourButton, yourButton.getWidth()/2, yourButton.getHeight()/2);                                         
}     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...