java - 类 javax.swing.Popup 实验
问题描述
我发现了 class javax.swing.Popup
。我编写了代码来测试它的行为。代码如下所示。当我运行代码时,JFrame
显示 后,我单击 SHOW 按钮并Popup
显示 。之后,我单击隐藏按钮,然后Popup
消失。但是,如果我再次单击“显示”按钮,则什么也没有发生。仅在第Popup
一次单击 SHOW 按钮后出现。另外,如果我先单击 HIDE 按钮,然后再单击 SHOW 按钮,那么当我单击 SHOW 按钮时,Popup
不会出现 。
我错过了什么吗?
难道我做错了什么?
我承认我没有调查过这种行为。我没有在网上搜索过,也没有看过 class Popup
nor的代码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);
}
}
解决方案
https://docs.oracle.com/javase/7/docs/api/javax/swing/Popup.html#hide()
您选择不阅读的文档非常清楚,hide()
处置Popup
和任何进一步的方法调用Popup
将导致不确定的行为。
Popup
您必须每次都创建一个新实例。
推荐阅读
- authentication - 使用 AWS Cognito 的 OpenID 混合流
- javascript - NS_BINDING_ABORTED 仅在 Firefox 中第一次 PUT 尝试时
- r - 程序不要求用户输入
- android - android studio 中的 java.lang.SecurityException
- python - 如何在 python 电报机器人上存储/打印多个回调值?
- python - Python:某些 Intellisense 不适用于 VS Code
- python - 如何从 DataFrame 列表中删除 DataFrame?
- apache - Apache 服务器不显示正确的网站
- registration - icp注册pcl库
- android - 有没有办法在 android Jetpack Compose 中自定义 LazyRow 拖动或滚动行为?