witam,
ponizej zamieszczam wycinek kodu. Mam co do niego "wolny wniosek" :-O
(niewielki program: JTextField i List. Po wcisnieciu Ctrl+S zapisuje (dodaje) wpis do listy. Ctrl+D usuwa ostatni wpis z listy.)
pytanie: putValue i getValue - po co? Czy nie wystarczyloby w wewn. klasie Zmiana stworzyc pól, ktore wyreczalaby te metody interfejsu Action? W tym wypadku dodac pole
'String czynnosc;'
w konstruktorze Zmiana(String) nadac czynnosci jakas nazwe (np. "zapisz")
a nastepnie w actionPerformed (w klasie Zmiana) siegnac po pole czynnosc?
Rozumiem, ze predefiniowane stale w interfejsie Action jak NAME czy SMALL_ICON moga miec jakies glebsze zastosowanie (choc na razie nie wiem jakie) to nie moge zrozumiec uzywania "wymyslonych" stalych (podchodza one w tym wypadku pod predefiniowana stala DEFAULT, tak?)
Taki sposob zaleca Horstmann (Java. Podstawy).
public class Main
{
public static void main(String[] args)
{
//...
}
}
class Okno extends JFrame
{
public Okno()
{
Container ct = getContentPane();
panel1 = new JPanel();
panel2 = new JPanel();
pole = new JTextField(15);
lista = new List();
//...
//definicja akcji
Action zapisywanie = new Zmiana("zapisz");
Action usuwanie = new Zmiana("usun");
//powiązanie SKRÓTU z NAZWĄ
// 'panel1' bo textfield z ktorego odczytujemy podczas shortkey jest w tym panelu
InputMap imap = panel1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
imap.put(KeyStroke.getKeyStroke("ctrl S"), "zapis");
imap.put(KeyStroke.getKeyStroke("ctrl D"), "usuniecie");
//powiązanie NAZWY z AKCJĄ
ActionMap amap = panel1.getActionMap();
amap.put("zapis", zapisywanie);
amap.put("usuniecie", usuwanie);
//...
}
private class Zmiana extends AbstractAction
{
public Zmiana(String czynnosc)
{
putValue("co", czynnosc);
}
public void actionPerformed(ActionEvent e)
{
String co = (String) getValue("co");
// Ctrl+S - 'zapisuje' do listy
if(co.equals("zapisz"))
lista.add(pole.getText());
// Ctrl+D - usuwa z listy
else if(co.equals("usun"))
lista.delItem( (lista.getItemCount()-1) );
}
}
//...
}