Obsah
Jednotlivé komponenty programu reagují na události:
klikání a pohyby myší, stisky tlačítek
"logické", generované jinou komponentou - např. "stisk" tlačítka v dialogu
Obsluha události je asynchronní vůči jiným vláknům - např. program může souběžně ukládat na disk a editovat text.
Události se řadí do fronty událostí a jsou obsluhovány vláknem message dispatcher.
Na delší akce je proto třeba vytvořit vlákno separátní, aby se neblokovalo ošetřování dalších událostí.
kde událost vznikne - na ni je třeba "zavěsit" posluchače události -> JButton
objekt, který pomocí "call-back" metody reaguje na vzniklou událost - tato metoda je vyvolána -> ActionListener
většinou implementujeme rozhraní ActionListener přímo na místě jako anonymní vnitřní třídu, jejíž instance má pak přístup k obsahu "mateřské" instance třídy, v niž je vnořena
// Vytvoříme instanci tlačítka
JButton button = new JButton("Moje");
// Vytvoříme posluchače události
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Zobrazíme dialogový box s informací o stisknutí tlačítka
JOptionPane.showMessageDialog(null,"Stisknuto tlačítko: " +
e.getActionCommand());
}
};
// Zaregistrujeme posluchače u komponenty, která událost může generovat
button.addActionListener(actionListener);
Pomocí metody SwingUtilities.invokeAndWait
nebo
SwingUtilities.invokeLater
- podobně, jako když
vytváříme vlákna. Kterou kdy?
I want to update a Swing component but I’m not in a callback (!!!) If I want the update to happen immediately (perhaps for a progress bar component) then I’d use
invokeAndWait
. If I don’t care when the update occurs, I’d useinvokeLater
. (from Interview Helper)