Banzaii Skrevet 28. februar 2004 Del Skrevet 28. februar 2004 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
leif81 Skrevet 29. februar 2004 Del Skrevet 29. februar 2004 Hva med å legge til en listener som lytter til forandringer? Eksempelvis kan du legge til en lytter som oppdaterer din JButton. Til a1 legger man til en slik lytter ved funksjonen a1.addPropertyChangeListener(..). Denne lytteren må sette nye verdier til knappen, og oppdatere dens gui. Lenke til kommentar
Banzaii Skrevet 29. februar 2004 Forfatter Del Skrevet 29. februar 2004 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
preconf Skrevet 2. mars 2004 Del Skrevet 2. mars 2004 (endret) overstyr createActionPropertyChangeListener som er en factory-metode til avledede objekter til AbstractButton. Endret 2. mars 2004 av preconf Lenke til kommentar
leif81 Skrevet 2. mars 2004 Del Skrevet 2. mars 2004 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 Lenke til kommentar
Banzaii Skrevet 3. mars 2004 Forfatter Del Skrevet 3. mars 2004 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå