我发现了javax.swing.Popup
类。我编写了代码来测试其行为。代码如下所示。当我运行代码时,在显示 JFrame
后,单击 SHOW 按钮,然后显示 Popup
。之后,我单击“隐藏”按钮,弹出窗口
消失。但如果我再次单击“显示”按钮,则什么也不会发生。 Popup
仅在第一次单击 SHOW 按钮后出现。另外,如果我在单击“显示”按钮之前先单击“隐藏”按钮,那么当我单击“显示”按钮时,弹出窗口
不会出现。
我错过了什么吗?
我做错了什么吗?
我承认我没有调查过这种行为。我没有在网上搜索,也没有查看类 Popup
和 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
每次实例。
关于java - 类 javax.swing.Popup 实验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56465857/