Как скрыть JPopupMenu, нажав кнопку? - PullRequest
0 голосов
/ 03 мая 2019

Я делаю программу, которая имеет всплывающее меню с двумя кнопками, одна из которых должна закрывать всплывающее меню, но я понятия не имею, как это сделать, и поиск в Google не прошел слишком хорошо.

Я пытался использовать 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 ]

1 голос
/ 03 мая 2019

frame.add(popup); это проблема. Не добавляйте JPopupMenu в контейнер. Вместо этого используйте setComponentPopupMenu .

В качестве альтернативы, вы можете сделать работу самостоятельно, добавив MouseListener, чьи методы mousePressed, mouseReleased и mouseClicked вызывают isPopupTrigger и show . (Это vital , что вы делаете это во всех трех из этих методов - разные платформы имеют разные условия для отображения всплывающих меню.)

Но на самом деле, использовать setComponentPopupMenu проще.

1 голос
/ 03 мая 2019

Используйте popup.setVisible (true) и popup.setVisible (false).

...