To może być bardzo prosta rzecz, którą przeoczyłem, ale po prostu nie mogę tego zrozumieć.JOptionPane.showMessageDialog czekać, aż zostanie kliknięty przycisk OK?
Mam następującą metodę, która aktualizuje JTable:
class TableModel extends AbstractTableModel {
public void updateTable() {
try {
// update table here
...
} catch (NullPointerException npe) {
isOpenDialog = true;
JOptionPane.showMessageDialog(null, "No active shares found on this IP!");
isOpenDialog = false;
}
}
}
Jednak nie chcę isOpenDialog
logiczna być ustawiona na false, dopóki przycisk OK w oknie komunikatu jest wciśnięty, ponieważ jeśli użytkownik naciśnięcie tego przycisku aktywuje zdarzenie KeyListener
na polu tekstowym i ponownie uruchamia cały blok kodu, jeśli jest ustawiony na false
.
część kodu KeyListener przedstawiono poniżej:
public class KeyReleased implements KeyListener {
...
@Override
public void keyReleased(KeyEvent ke) {
if(txtIPField.getText().matches(IPADDRESS_PATTERN)) {
validIP = true;
} else {
validIP = false;
}
if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
if (validIP && !isOpenDialog) {
updateTable();
}
}
}
}
Czy JOptionPane.showMessageDialog()
mieć jakiś mechanizm, który uniemożliwia wykonanie następnego wiersza, aż przycisk OK jest wciśnięty? Dziękuję Ci.
operacji Swing (takie jak otwarcie okna dialogowego) powinno nastąpić w EventDispatchThread –
Zgadzam się z hałasem: Ten rodzaj kodu nie należy w aplikacji Swing, ponieważ całkowicie ignoruje zasady Swing threading. –
Nawet ja zgadzam się, że operacja Swing musi się zdarzyć w wątku Dispatchera zdarzeń, ponieważ metoda main() w aplikacji swingowej planuje budowę GUI w wątku Dispachera zdarzeń i kończy działanie. Zasady opisane w książkach dotyczą świata idealnego, a czasami trzeba być buntownikiem, aby wykonać pracę. –