簡體   English   中英

Java Swing-從外部線程關閉JDialog

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM