簡體   English   中英

基於網絡連接標志的 JavaSwing 更新按鈕

[英]JavaSwing Update button based on Network Connection flag

我有一個 Java swing 用戶界面,如果我無法檢測到活動的 inte.net 連接,我需要禁用用戶界面上的按鈕。

到目前為止,代碼 function 正確,但是當我與 inte.net 斷開連接時,它不會重新觸發更新 boolean 標志的方法。

如何在該標志上添加一個事件,讓我的按鈕在應用程序的生命周期內使用它?

public class Main {
private static JButton button;
private static boolean testButtonEnabled;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            /*
             * function that returns true/false if connected to the internet
             */
            if(Utils.isConnectedToInternet()) {
                logger.debug("System is connected to the internet");
                testButtonEnabled=true;
            } else {
                logger.debug("System is not connected to the internet");
                testButtonEnabled=false;
            }

            Main window = new Main();
            window.frame.setVisible(true);  

            button = new JButton("my button");
            /* 
             * set the internet status
             */
            button.setVisible(testButtonEnabled);
        }
    }
}

}

同樣,這段代碼:

SwingWorker<Void, String>  worker = new SwingWorker<Void, String>()
        {
            public Void doInBackground()
            {
                while(true)
                {
                    
                    try {
                        isConnectedToInternet = Utils.isConnectedToInternet();
                        if (isConnectedToInternet) {
                            btn_online2.setEnabled(isConnectedToInternet);
                        } else {
                            btn_online2.setEnabled(isConnectedToInternet);
                        }
                        logger.debug("Internet connection status: " + isConnectedToInternet);
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        worker.execute();

很危險,因為它從后台線程對 Swing 組件進行突變更改。 雖然此代碼可能在 95% 的時間都有效,但它可能會以不可預測的方式和不可預測的時間失敗。 最好只事件線程上改變 Swing 個組件。 例如,即使這樣會更好:

SwingWorker<Void, String>  worker = new SwingWorker<Void, String>() {
    @Override
    public Void doInBackground() {
        while(true) {
            try {
                isConnectedToInternet = Utils.isConnectedToInternet();
                // note that there is no need for the if/else block
                SwingUtilities.invokeLater(() -> {
                    btn_online2.setEnabled(isConnectedToInternet);
                });
                logger.debug("Internet connection status: " + isConnectedToInternet);
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};
worker.execute();

或者更好的是,使用 SwingWorker 的發布/過程:

SwingWorker<Void, Boolean>  worker = new SwingWorker<Void, Boolean>() {
    @Override
    public Void doInBackground() {
        while(true) {
            try {
                isConnectedToInternet = Utils.isConnectedToInternet();
                // note that there is no need for the if/else block
                publish(Utils.isConnectedToInternet());
                logger.debug("Internet connection status: " + isConnectedToInternet);
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    @Override
    protected void process(List<Boolean> chunks) {
        for (Boolean chunk : chunks) {
            btn_online2.setEnabled(chunk);
        }
    }
};
worker.execute();

我能夠在框架的 initialize() 中使用以下方法解決。

添加 swingworker 的更改部分允許按鈕檢查標志並在它發生變化時將其分配給自己。

現在,只要 inte.net 斷開連接,該按鈕就會被禁用,而無論何時連接,該按鈕都會啟用。

SwingWorker<Void, String>  worker = new SwingWorker<Void, String>()
        {
            public Void doInBackground()
            {
                while(true)
                {
                    
                    try {
                        isConnectedToInternet = Utils.isConnectedToInternet();
                        if (isConnectedToInternet) {
                            btn_online2.setEnabled(isConnectedToInternet);
                        } else {
                            btn_online2.setEnabled(isConnectedToInternet);
                        }
                        logger.debug("Internet connection status: " + isConnectedToInternet);
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        worker.execute();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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