首页 > 解决方案 > 类 javax.swing.Popup 实验

问题描述

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

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

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

这是我的 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);
    }
}

标签: javaswing

解决方案


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

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

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


推荐阅读