我有一個 Java swing UI,如果我無法檢測到活動的互聯網連接,我需要禁用 UI 上的一個按鈕。
到目前為止,代碼運行正常,但是當我與 Internet 斷開連接時,它不會重新觸發更新布爾標志的方法。
如何在該標志上添加一個事件以讓我的按鈕在應用程式的生命周期內使用它?
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);
}
}
}
}
uj5u.com熱心網友回復:
同樣,這段代碼:
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();
uj5u.com熱心網友回復:
我能夠在框架的 initialize() 中使用以下方法解決。
添加 swingworker 的更改部分允許按鈕檢查標志并在其更改時將其分配給自身。
現在,無論何時斷開互聯網,該按鈕都會被禁用,而無論何時連接,該按鈕都會被啟用。
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();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511830.html
標籤:爪哇多线程摇摆旗帜
