[英]Java Swing - Close JDialog from external Thread
我正在与Swing合作,但无法正常工作。
我需要的是以下内容:
我有一个可以连接到TCP服务器的“客户端”类。 如果连接失败(例如,错误的IP),则会显示一个错误对话框,可通过单击“确定”按钮关闭该对话框。
但是,如果客户端成功连接,则应弹出一个窗口,直到我的客户端从服务器接收到特定的消息为止。
我的代码如下所示:
if(ip != null) {
Client c = new Client();
try{
c.connect(ip, 56556);
JOptionPane msg = new JOptionPane("Connecting...", JOptionPane.INFORMATION_MESSAGE);
JDialog dlg = msg.createDialog("Connecting...");
dlg.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dlg.setVisible(true);
c.addIncomingMessageHandler(new IncomingMessageHandler(){
@Override
public void incomingMessage(Connection<?> cnctn, Object o) {
dlg.setVisible(false);
dlg.dispose();
}
});
}catch(Exception e) {
int n = JOptionPane.showOptionDialog(this, "Oops! Something went wrong!",
"Title", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE,
null, new Object[] {"OK"}, JOptionPane.OK_OPTION);
}
}
因此,如果c.connect()
失败,则会引发异常。 c.addIncomingMessageHandler()
是一个侦听器,它侦听到客户端的所有传入消息。 如果服务器发送了一些内容,则将调用此方法。 如果是这种情况,JDialog将关闭。 但是可以通过单击“确定”按钮立即关闭此窗口。
我想重命名该按钮并添加一个功能。 新文本应为“取消”,如果按下该按钮,则应关闭客户端(c.disconnect),同时也应关闭窗口本身。
我该怎么办?
从文档中:
停止自动关闭对话框
默认情况下,当用户单击JOptionPane创建的按钮时,对话框关闭。 但是,如果要在关闭对话框之前检查用户的答案怎么办? 在这种情况下,您必须实现自己的属性更改侦听器,以便在用户单击按钮时,对话框不会自动关闭。
DialogDemo
包含两个实现属性更改侦听器的对话框。 这些对话框之一是在CustomDialog
实现的自定义模式对话框,该对话框使用JOptionPane
来获取标准图标并获得布局帮助。 另一个对话框(其代码如下)使用标准的Yes/No JOptionPane
。 尽管此对话框在编写时没有多大用处,但其代码非常简单,您可以将其用作更复杂对话框的模板。除了设置属性更改侦听器之外,以下代码还调用JDialog的
setDefaultCloseOperation
方法并实现一个窗口侦听器,该侦听器可以正确处理窗口关闭尝试。 如果您不希望在用户显式关闭窗口时收到通知,请忽略粗体代码。
final JOptionPane optionPane = new JOptionPane(
"The only way to close this dialog is by\n"
+ "pressing one of the following buttons.\n"
+ "Do you understand?",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION);
final JDialog dialog = new JDialog(frame,
"Click a button",
true);
dialog.setContentPane(optionPane);
dialog.setDefaultCloseOperation(
JDialog.DO_NOTHING_ON_CLOSE);
dialog.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
setLabel("Thwarted user attempt to close window.");
}
});
optionPane.addPropertyChangeListener(
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (dialog.isVisible()
&& (e.getSource() == optionPane)
&& (prop.equals(JOptionPane.VALUE_PROPERTY))) {
//If you were going to check something
//before closing the window, you'd do
//it here.
dialog.setVisible(false);
}
}
});
dialog.pack();
dialog.setVisible(true);
int value = ((Integer)optionPane.getValue()).intValue();
if (value == JOptionPane.YES_OPTION) {
setLabel("Good.");
} else if (value == JOptionPane.NO_OPTION) {
setLabel("Try using the window decorations "
+ "to close the non-auto-closing dialog. "
+ "You can't!");
}
点击这里 !
相关问题 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.