如何通过按下按钮隐藏JPopupMenu?

时间:2019-05-02 22:26:16

标签: java swing jpopupmenu

我正在制作一个带有两个按钮的弹出菜单的程序,其中一个应该关闭弹出菜单,但是我不知道该怎么做,并且谷歌搜索还不太顺利。

我尝试使用popup.hide(),但是即使我尝试仅移动弹出窗口,菜单也不会返回。在这种情况下,还需要我放置一个SuppressWarning,并且完全关闭它花了几秒钟。有更好的方法吗?

我不确定哪种代码是相关的,但是这是相关的按钮及其作用(我跳过了所有看起来不相关的GUI部分的创建,一切看起来都不错,我知道这些按钮在工作中): 包装测试;

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

interface CustomButton {

    JButton create();

    void react(JPopupMenu popup, JFrame frame);
}

class ErrandsButton implements CustomButton {

    private JButton errands = new JButton("Errands");

    public JButton create() {
        return errands;
    }

    public void react(JPopupMenu popup, JFrame frame) {
        errands.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                popup.show(frame, 120, 65);
            }
        });
    }
}

class Test {

    static JFrame frame = new JFrame("List");
    static CustomButton errands = new ErrandsButton();
    static JButton cancelTask = new JButton("Cancel");
    static JPopupMenu popup = new JPopupMenu();

    static void cancelTask() {
        cancelTask.addActionListener(new ActionListener() {
            @SuppressWarnings("deprecation")
            public void actionPerformed(ActionEvent e) {
                popup.hide();
            }
        });
    }

    public static void main(String args[]) {
        createInterface();
        cancelTask();
        errands.react(popup, frame);
    }

    static void createInterface() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        JPanel popup1 = new JPanel();
        JPanel button = new JPanel();
        popup1.add(cancelTask);
        popup.add(popup1);
        frame.add(popup);
        button.add(errands.create());
        frame.getContentPane().add(BorderLayout.CENTER, button);
        frame.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:1)

使用popup.setVisible(true)和popup.setVisible(false)。

答案 1 :(得分:1)

frame.add(popup);是问题所在。不要将JPopupMenu添加到容器中。而是使用setComponentPopupMenu

或者,您可以自己添加一个MouseListener来完成工作,该MouseListener的mousePressed,mouseReleased和mouseClicked方法分别调用isPopupTriggershow。 (在所有这三种方法中都是 vital -不同的平台具有不同的显示弹出菜单的条件。)

但是实际上,使用setComponentPopupMenu更容易。