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) );
         
      }
   }
   
   //...
}