Создание меню при нажатии кнопки в Java

#java #user-interface

#java #пользовательский интерфейс

Вопрос:

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

Комментарии:

1. Хорошо. Итак, в чем вопрос?

2. Как вы это делаете? Я исправлю вопрос.

Ответ №1:

Используйте 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);
    }
}
  

Скриншот

введите описание изображения здесь

Ответ №2:

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

     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. «Я бы, вероятно, сделал это так: .. » btnClickMe.setBounds(10, 30, 89, 23); . Не стесняйтесь давать советы, пока THC не очистится. 1) Не должно быть необходимости устанавливать размер компонентов (в большинстве случаев, и, конечно, в этом). 2) Добавляя к кнопке только MouseListener , вы теряете возможность активировать кнопку с клавиатуры. Я приговариваю вас к 2 неделям без мыши. Офицеры, уведите нарушителя.

2. @Andrew Код для кнопки и рамки — это просто перетаскивание в windowbuilder. Важной частью является обработка событий мыши в сочетании с всплывающим меню. Не стесняйтесь игнорировать эту часть, если это каким-либо образом наносит вам психологический вред. Что касается выбора mouselistener, был задан вопрос о щелчке мыши, и я подумал, что эта перспектива может быть полезна в случаях, когда вам нужно идентифицировать определенный щелчок мыши (отсюда комментарий об идентификации значения кнопки).

Ответ №3:

Это код для 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();
    }
}
  

Комментарии:

1. Графические интерфейсы Swing должны быть созданы на EDT. Первые пару раз, когда я запускал ваш исходный код, рамка была пустой! Пожалуйста, используйте форматирование кода для примеров кода в будущем.

2. @Andrew Thompson пожалуйста, попробуйте развернуть окно по максимуму и повторите попытку. Они будут видны вам.

Ответ №4:

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

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

}
  

введите описание изображения здесь
введите описание изображения здесь

Ответ №5:

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

Внутри ваших кнопок выполнено действие:

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