Как уже упоминалось, логика подключения лучше всего выполняется в потоке, отличном от потока диспетчеризации событий.Однако технически это не причина, по которой текстовое поле не обновляется до тех пор, пока не будет установлено соединение.
Фактическая причина, по которой это происходит, заключается в том, что внутренние компоненты Swing используют структуру данных для хранения прослушивателей (в данном случае ActionListener
s), когда слушатели уведомляются в обратном порядке по сравнению с порядком, в который они были добавлены.Следовательно, в вашем примере ActionListener
, который создает соединение, уведомляется перед слушателем, ответственным за обновление текста.
Простым решением было бы объединить два ActionListener
s в один блок кода.;нет причин для добавления нескольких слушателей.Это, конечно, приведет к блокировке вашего графического интерфейса во время попытки подключения, поэтому другие рекомендуют использовать такой механизм, как SwingWorker
, чтобы предотвратить это.
connectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
statusBar.setText("Connecting...");
new SwingWorker<Void, Void>() {
protected Void doInBackground() {
// Called on a background thread.
connectToDatabase();
return null;
}
protected void done() {
// Called on Event Dispatch thread once connect routine has completed.
try {
get(); // Propagate any exceptions back to Event Dispatch thread.
} catch (Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(null,
"Failed to connect: " + ex.getMessage(),
"Error",
JOptionPane.ERROR_MESSAGE);
}
}
}.execute();
}
});