[英]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.