Ho imparato a sapere come lo swing non è sicuro per i thread. Scavando più a fondo, ho scoperto che ogni modifica a un componente swing deve essere eseguita sul thread di invio eventi per evitare vari problemi associati al multithreading. Tuttavia, le informazioni sembravano fermarsi completamente lì. Non sembra essere un buon tutorial che spiega come farlo ovunque sia accessibile su Internet.Come si usa il thread di invio eventi?
Patching insieme le informazioni dal codice scritto in relazione ad altre questioni, sembrava che avrei dovuto mettere un blocco disordinato di codice intorno ad ogni singola modifica oscillazione nel mio programma (come in questo esempio dal mio proprio codice):
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
setTitle("Frame title");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(800, 480);
setLocationRelativeTo(null);
setIconImage(Toolkit.getDefaultToolkit().createImage(ClassLoader.getSystemResource("Frame icon.png")));
}
});
} catch (Exception e) {
e.printStackTrace();
}
Fondamentalmente, è giusto? Devo inserire quel codice (o l'equivalente di invokeLater) attorno ad ogni modifica di un componente Swing nel mio codice?
Inoltre, perché Swing non lo fa automaticamente?
non è buono come quello che desideri, ma puoi installare il codice di rilevamento automatico delle violazioni Swing/EDT e riscuotono un sacco di errori (non hai alcun collegamento a portata di mano ma ce ne sono alcuni). – TacticalCoder
Microsoft nell'era di Windows 3.0/3.1 aveva "Debug Binaries" che eseguivano questo tipo di controllo in modo da non dover riavviare ogni volta che si inviavano argomenti non validi. Mi ha sempre infastidito il fatto che Java non avesse lo stesso, specialmente perché è abbastanza intelligente da essere in grado di compilarlo su un interruttore della riga di comando. –
L'ho sempre usato per mettere "in" l'app Java, sostituendo il/i gestore/i ridisegno con * CheckThreadViolationRepaintManager *. Ricordo che funzionava abbastanza bene:) – TacticalCoder