java - 类 javax.swing.Popup 实验

标签 java swing

我发现了javax.swing.Popup类。我编写了代码来测试其行为。代码如下所示。当我运行代码时,在显示 JFrame 后,单击 SHOW 按钮,然后显示 Popup。之后,我单击“隐藏”按钮,弹出窗口消失。但如果我再次单击“显示”按钮,则什么也不会发生。 Popup 仅在第一次单击 SHOW 按钮后出现。另外,如果我在单击“显示”按钮之前先单击“隐藏”按钮,那么当我单击“显示”按钮时,弹出窗口不会出现。

我错过了什么吗?
我做错了什么吗?

我承认我没有调查过这种行为。我没有在网上搜索,也没有查看类 PopupPopupFactory 的代码,只是因为懒惰,希望有人能解释一下我。

这是我的 MCVE。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class PopupTest implements ActionListener, Runnable {
    private static final String HIDE = "HIDE";
    private static final String SHOW = "SHOW";
    private Popup popup;

    public void actionPerformed(ActionEvent actionEvent) {
        String actionCommand = actionEvent.getActionCommand();
        switch (actionCommand) {
            case HIDE:
                popup.hide();
                break;
            case SHOW:
                popup.show();
                break;
        }
    }

    public void run() {
        showGui();
    }

    private void showGui() {
        JFrame frame = new JFrame("Popup");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JLabel centerLabel = new JLabel("CENTER LABEL", SwingConstants.CENTER);
        frame.add(centerLabel, BorderLayout.CENTER);
        JPanel buttonsPanel = new JPanel();
        JButton showButton = new JButton(SHOW);
        showButton.addActionListener(this);
        buttonsPanel.add(showButton);
        JButton hideButton = new JButton(HIDE);
        hideButton.addActionListener(this);
        buttonsPanel.add(hideButton);
        frame.add(buttonsPanel, BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        JLabel popupLabel = new JLabel("Popup_Label");
        PopupFactory factory = PopupFactory.getSharedInstance();
        Point pt = centerLabel.getLocationOnScreen();
        int x = pt.x + 10;
        int y = pt.y - 10;
        popup = factory.getPopup(centerLabel, popupLabel, x, y);
    }

    public static void main(String[] args) {
        PopupTest instance = new PopupTest();
        EventQueue.invokeLater(instance);
    }
}

最佳答案

https://docs.oracle.com/javase/7/docs/api/javax/swing/Popup.html#hide()

您选择不阅读的文档非常清楚hide()处置Popup以及任何进一步的方法调用 Popup将导致不确定的行为。

您必须创建一个新的Popup每次实例。

关于java - 类 javax.swing.Popup 实验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56465857/

相关文章:

java - 生产JVM的安全调试

java - 在 JTable 中使用 setAutoCreateRowSorter 对不同数据类型进行排序

java - JPanel 位于另一个 JPanel 内 : Swing

java - 如何正确获得此 GUI 布局?

java - 如何同时运行 Swing.timer 而不会出现延迟或性能下降

java - 重写 Java 接口(interface)中的对象类方法

java - 反序列化 Avro 序列化 Kafka Stream 的问题

java - JProgressBar 不可见,但进度正在正确更新

java - 重新安装Java JDK后无法在ubuntu上打开eclipse

java - 检查 JComboBox 是否具有默认值