Gå til innhold

Anbefalte innlegg

Jeg har vanskeligheter med å endre/oppdatere Action verdier.

 

Senario eks.

 

Jeg har 2 stk. Action objekter, a1 og a2. Begge er initialisert med verdier. a2 har som oppgave å endre verdier for a1.

 

Action a1 = new AbstractAction(){..}
a1.putValue(Action.NAME, "navn");
a1.putValue(Action.MNEMONIC, new Integer('A'));
a1.putValue(Action.SHORT_DESCRIPTION, "beskrivelse");
a1.putValue(Action.SMALL_ICON, new ImageIcon("c:/icon.gif"));

Action a2 = new AbstractAction(){
  public void actionPerformed(ActionEvent evt){
     a1.putValue(Action.NAME, "nytt navn");
     a1.putValue(Action.MNEMONIC, new Integer('N'));
     a1.putValue(Action.SHORT_DESCRIPTION, "Ny beskrivelse");
     a1.putValue(Action.SMALL_ICON, new ImageIcon("c:/nytticon.gif"));
  }
}

 

Komponentet som bruker a1 (jmenu, jbutton etc.) viser de gamle verdiene for mnemonic og short_description etter at a2 er aktivert.

 

Er det noen som har en idé om hvordan man kan løse eller gå rundt dette problemet..? Står fast.

Lenke til kommentar
Videoannonse
Annonse

Hmm.. Jeg vet ikke helt hvor du ville med PropertyChangeListener. Jeg får jo utført det som skal utføres i ActionListener. Problemet er at endringer ikke oppdaterer seg grafisk i applikasjonen.

 

Jeg har testet litt og funnet ut at det er bare ved bruk av jmenu det er problemer med å endre Action verdier (jtoolbars og jbuttons oppdaterer seg uten problemer).

Jeg har kommet frem til en løsning som innebærer å bruke en protected metode i JMenuItem klassen. Eks.

 

JMenu menu = new JMenu("menu");
MyMenuItem m1 = new MyMenuItem(a1);
menu.add(m1);
..
private class MyMenuItem extends JMenuItem{
  public MyMenuItem(Action act){
     super(act);
  }
  public void updateItem(Action in){
     configurePropertiesFromAction(in);  	
  }
}
..
Action a2 = new AbstractAction(){
  public void actionPerformed(ActionEvent evt){
     a1.putValue(Action.NAME, "nytt navn");
     a1.putValue(Action.MNEMONIC, new Integer('N'));
     a1.putValue(Action.SHORT_DESCRIPTION, "Ny beskrivelse");
     a1.putValue(Action.SMALL_ICON, new ImageIcon("c:/nytticon.gif"));
     m1.updateItem(a1);
  }
}

Er det noen som har kommentarer til koden? Er det noen som vet hvordan dette kan gjøres enklere? Jeg er litt usikker på om dette er den riktigste/enkleste måten å endre Action verdier i en jmenu på.

Lenke til kommentar

Jeg har lest litt i JavaDokumentasjonen og kommet fram til at man kan overstyre oppdateringen av komponenten ved endring til Properties i dens Action-objekt. Standard-implementasjonen er som du har erfart, varierende.

 

Eksempelvis kan MyMenuItem se slik ut:

import java.beans.PropertyChangeListener;
....
private class MyMenuItem extends JMenuItem {
 public MyMenuItem(Action a){
    super(a);
 }

 private PropertyChangeListener createSuperActionPropertyChangeListener(Action a) {
   return super.createActionPropertyChangeListener(a);   
 }

 protected PropertyChangeListener createActionPropertyChangeListener(final Action a) {
  return  new PropertyChangeListener() {
    {
      //tar vare på referanse til standard-implementasjon
      orgLytter = (MyMenuItem.this).createSuperActionPropertyChangeListener(a);
    }
    PropertyChangeListener orgLytter;

    public void propertyChange( java.beans.PropertyChangeEvent pce) {
       if (pce.getPropertyName().equals( Action.SHORT_DESCRIPTION)) {
         setToolTipText(pce.getNewValue().toString());
       }
       else if (pce.getPropertyName().equals( Action.SMALL_ICON)) {
         setIcon( (Icon)pce.getNewValue() );
       }
       else {
         orgLytter.propertyChange(pce); //kall til superklasse
       }
    }
   };//slutt paa return
 }//slutt createActionPropertyChangeListener
}//slutt MyMenuItem

Nå vil komponenten korrekt kunne oppdater alle de verdier du vil :thumbup:

Lenke til kommentar

Takker leif81 for løsningsforslag. Jeg har nettopp testet din MyMenuItem klasse og den funka.

 

Jeg tror det ligger et "bug" i metoden: JMenu.add(Action a). Man får ikke noen feilmld, med dersom man endrer verdier for Action, vil JMenu ofte bare oppdatere navn og bilde, men ikke mnemonic og beskrivelse.

 

Det virker som det er mulig å løse problemet ved å konsekvent bruke JMenuItems: JMenuItem(Action a), JMenu.add(JMenuItem m).

 

Hvis dette er tilfellet kan jeg sløyfe 3 stk. hjelpeklasser. Kom med tilbakemld dersom dere har opplevd noe annet..!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...