100 likes | 266 Views
Actions. Motivation. In verschiedenen Swing-Komponenten werden ausgelöste Aktionen durch ActionListener behandelt. Häufig werden gleiche Aktionen durch verschiedene Swing-Komponenten ausgelöst. Z.B. durch MenuItems, Buttons, Textfelder, Comboboxen
E N D
Motivation • In verschiedenen Swing-Komponenten werden ausgelöste Aktionen durch ActionListener behandelt. • Häufig werden gleiche Aktionen durch verschiedene Swing-Komponenten ausgelöst. Z.B. durch MenuItems, Buttons, Textfelder, Comboboxen • Das Erscheinungsbild dieser Komponenten ähnelt sich häufig. Es werden gleiche Beschriftungen und Icons verwendet. • Es werden gleiche ToolTip-Texte und Mnemonic und Accelerator Keys verwendet. • Die Komponente sind alle gleichzeitig zu aktivieren bzw. zu deaktivieren. • Es ist zweckmäßig die Realisierung der Aktion sowie das Erscheinungsbild der Swing-Komponenten an einer Stelle zu zentralisieren. Interface Action und abstrakte Klasse AbstractAction
Das Interface Action • Das Interface Action ist abgeleitet vom Interface ActionListener und erbt damit die Methodepublic void actionPerformed (ActionEvent e) • Bei einer Swing-Komponente wird ein Action-Object mit der Methodepublic void setAction(Action a)registriert. • Das selbe Action-Objekt kann bei verschiedenen Komponenten registriert werden. • Mit den Methodenpublic boolean isEnabled() bzw.public void setEnabled(boolean b)des Action-Interfaces wird der Status aller Komponenten bei dem das Action-Objekt registriert ist abgefragt bzw. modifiziert.
Die Methodenpublic Object getValue(String key) bzw.public void putValue(String key, Object value)fragen den Wert einer Eigenschaft ab bzw. modifizieren diesen. • Folgende Schlüssel sind definiert: • NAME : entspricht setText(…) • SHORT_DESCRIPTION : entspricht setToolTipText()…) • LONG_DESCRIPTION : Text für Online-Helps • SMALL_ICON : entspricht setIcon(…) • ACTION_COMMAND_KEY : entspricht setActionCommand(…) • ACCELERATOR_KEY : entspricht setAcceleratorKey(…) • MNEMONIC_KEY : entspricht setMnemonic(…) • Anwendungsbeispiel:putValue(Action.SHORT_DESCRIPTION, "Action");
Die abstrakte Klasse AbstractAction • Die abstrakte Klasse AbstractAction implementiert alle Methoden des Interfaces Action außer der Methode actionPerformed, die vom Interface ActionListener geerbt wird. • Die einfachste Variante der Nutzung ist das Ableiten einer Klasse, die die Methode actionPerformed implementiert. • Die Nutzung ist also genauso einfach wie die Nutzung des Interfaces ActionListener.
Beispiel TestAction import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TestActions { public static Action act = new AbstractAction("Action Component", new mageIcon("action.gif")){ { putValue(Action.SHORT_DESCRIPTION, "Action ToolTipText"); } public void actionPerformed(ActionEvent e) { String src = e.getSource().getClass().getName(); if (src.equals("javax.swing.JComboBox")) { JComboBox cb = (JComboBox)(e.getSource()); if ( !cb.getSelectedItem().equals(getValue(Action.NAME)) ) return; } System.out.println("Action ausgelöst von "+src); } };
public static void main(String[] args) { JFrame fr = new JFrame("TestActions"); JMenuBar mb = new JMenuBar(); fr.setJMenuBar(mb); JMenu m = new JMenu("test"); mb.add(m); JMenuItem mi = new JMenuItem(); mi.setAction(act); m.add(mi); Container cp = fr.getContentPane(); cp.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor=GridBagConstraints.WEST; gbc.insets=new Insets(10, 10, 10, 10); gbc.gridx=0; cp.add(new JLabel("JButton"), gbc); JButton jb = new JButton(); jb.setAction(act); gbc.gridx=1; cp.add(jb, gbc);
gbc.gridx=0; cp.add(new JLabel("JComboBox"), gbc); final JComboBox co = new JComboBox(new Object [] {"Zeile1", "Zeile2", act.getValue(Action.NAME), "Zeile4", "Zeile5"} ); co.setAction(act); gbc.gridx=1; gbc.fill=GridBagConstraints.HORIZONTAL; cp.add(co, gbc); gbc.gridx=0; gbc.gridwidth=2; final JButton activateButton = new JButton("disable"); activateButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { activateButton.setText(act.isEnabled()?"enable":"disable"); act.setEnabled(!act.isEnabled()); } }); cp.add(activateButton, gbc);
gbc.gridx=0; cp.add(new JLabel("setToolTipText"), gbc); final JTextField tt = new JTextField(); tt.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { act.putValue(Action.SHORT_DESCRIPTION, tt.getText()); } }); gbc.gridx=1; cp.add(tt, gbc); fr.setBounds(0, 0, 400, 400); fr.setVisible(true); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }