gpt4 book ai didi

java - JFrame 问题

转载 作者:行者123 更新时间:2023-12-04 15:48:54 25 4
gpt4 key购买 nike

我正在创建一个弹出式 JFrame,它将包含一条消息和是/否按钮。我以两种方式使用这种方法。在 1 中,主程序调用此方法,在另一种情况下,在关闭前一个 JFrame 后直接调用此方法。从主程序调用此方法时有效,但当另一个 JFrame 调用它时,在此方法中创建的 JFrame 显示完全空白并且 GUI 卡住。我无法退出 JFrame,但我可以移动它。卡住是 Thread.yield 的结果,因为响应始终为 null,但在什么情况下 JFrame 无法正确创建?

注意:response是一个静态变量。此外,当此 JFrame 由另一个 JFrame 创建时,原始 JFrame 无法正确退出。该 JFrame 有一个 JComboBox,并且所选选项在下拉列表中被卡住。当它不调用此方法时,它会正确关闭。

public static String confirmPropertyPurchase(String message)
{
response = null;
final JFrame confirmFrame = new JFrame("Confirm");
confirmFrame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
response = "No";
}
public void windowDeactivated(WindowEvent e) {
confirmFrame.requestFocus();
}
});

final JPanel confirmPanel = new JPanel();
final JButton yes = new JButton();
final JButton no = new JButton();
yes.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
response = "Yes";
confirmFrame.setVisible(false);
}
});
no.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
response = "No";
confirmFrame.setVisible(false);
}
});

final JLabel confirmLabel = new JLabel(" " + message);
yes.setText("Yes");
yes.setPreferredSize(new Dimension(100, 100));
no.setText("No");
no.setPreferredSize(new Dimension(100,100));
confirmFrame.add(confirmLabel, BorderLayout.CENTER);
confirmPanel.add(yes);
confirmPanel.add(no);
confirmFrame.add(confirmPanel, BorderLayout.AFTER_LAST_LINE);
confirmFrame.setPreferredSize(new Dimension(520, 175
));

confirmFrame.pack();
confirmFrame.setVisible(true);

while(response == null)
{
Thread.yield();
}
return response;
}

最佳答案

同样,您不应该将 JFrame 用作对话框。事实上,您的全部代码都可以用一个简单的 JOptionPane 代替。例如,

  Component parent = null;  // non-null if being called by a GUI
queryString = "Do you want fries with that?";
int intResponse = JOptionPane.showConfirmDialog(parent, queryString,
"Confirm", JOptionPane.YES_NO_OPTION);
myResponse = (intResponse == JOptionPane.YES_OPTION) ? "Yes" : "No";
System.out.println(myResponse);

还有这个:

    while(response == null)
{
Thread.yield();
}

永远不应在主 Swing 线程、EDT 或事件派发线程上调用。代码在执行时起作用的原因是因为您在 EDT 上方调用了这一点,但是当您在 EDT 上调用它时,它会卡住 EDT,从而卡住整个 GUI。不要这样做。

关于java - JFrame 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6169037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com