Przeczytałem, że cały kod, który tworzy komponenty Swing i obsługuje zdarzenia, musi być uruchamiany przez wątek wywołania zdarzenia. Rozumiem, w jaki sposób jest to realizowane przy użyciu metody SwingUtilities.invokeLater()
. Rozważmy następujący kod gdzie inicjalizacji GUI odbywa się w sposób sam main
Gdzie jest wywoływany wątek wywołania zdarzenia?
public class GridBagLayoutTester extends JPanel implements ActionListener {
public GridBagLayoutTester() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
JButton button = new JButton("Testing");
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
button.addActionListener(this);
add(button, gbc);
}
public void actionPerformed(ActionEvent e) {
System.out.println("event handler code");
}
public static void main(String[] args) {
JFrame frame = new JFrame("GridBagLayoutDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(new GridBagLayoutTester(), BorderLayout.CENTER);
frame.setSize(800, 600);
frame.pack();
frame.setVisible(true);
System.out.println("Exiting");
}
}
Jak to jest, że ten kod działa doskonale? Budujemy JFrame
i wywołujemy wiele innych metod w głównym wątku. Nie rozumiem, gdzie dokładnie pojawia się tu EDT (jaki kod wykonuje?). Konstruktor klasy GridBagLayoutTester
jest również wywoływany z metody main
, co oznacza, że EDT go nie uruchamia.
W skrócie
- Kiedy jest EDT czym zaczęło? (czy JVM uruchamia EDT wraz z główną metodą, jeśli w ogóle EDT jest uruchamiany podczas uruchamiania tego kodu?)
- Czy kod obsługi zdarzenia dla przycisku działa na EDT?
chodzi Component.repaint() Wątpię, to tylko „ustawia flagę”, to faktycznie kolejki wydarzenie malarstwa (który zostanie przetworzony przez EDT). – jfpoilpret
Wzór jest taki sam. Nie musisz znać wewnętrznych cech tego sposobu, w jaki jest to obsługiwane, aby z powodzeniem używać EDT. –
, więc wywołanie frame.setVisible() jest wykonywane na EDT? – Stormshadow