[Java] AbstractActions die elkaar en/disablen

Pagina: 1
Acties:

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Ik ben bezig een gui te maken als package bla.gui
M'n actions staan in bla.actions en worden aan een JButton gekoppeld via een

Java:
1
bla.setAction(new BlaAction())

Ik heb nu 2 zo'n buttons naast mekaar: 1 om een filter op een reeks gegevens te plaatsen en 1 om die filter terug weg te halen. Als op 1 van de twee geklikt wordt, moet deze gedisabled worden en de andere ge-enabled.

De action zelf disablen is geen probleem, gewoon via

Java:
1
this.setEnabled(false)

maar het enablen van de andere lukt me niet. Met onderstaande code maakt hij natuurlijk een nieuw object aan ipv het oude te hergebruiken.

Java:
1
2
Eerst BlaAction x = new BlaAction();
x.setEnabled(true); 



Eum .. help! :?

  • CyBoB
  • Registratie: Januari 2001
  • Laatst online: 24-12-2025

CyBoB

.::BURB::.

je kan het doen door elke action een referentie naar de andere action mee te geven.

deze manier is alleen niet erg mooi en ook niet echt herbruikbaar, maar het werkt wel :)

<edit>
misschien is er wel een design pattern voor te vinden.
</edit>

[ Voor 18% gewijzigd door CyBoB op 30-12-2002 14:43 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

CyBoB schreef op 30 december 2002 @ 14:42:
je kan het doen door elke action een referentie naar de andere action mee te geven.

deze manier is alleen niet erg mooi en ook niet echt herbruikbaar, maar het werkt wel :)

<edit>
misschien is er wel een design pattern voor te vinden.
</edit>
mvc ;)

Je moet een view model maken, waarin de view op kan reageren. vb.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class ViewModel{
      public final static String FILTERED = "filtered";

     private boolean _filtered = false;
     private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

     public void setFiltered(boolean filtered){
          boolean oldValue = _filtered'
          _filtered = filtered;
          pce.firePropertyChange(FILTERED,oldValue,_filtered);
     }

    public boolean isFiltered(){return _filtered;}

    public PropertyChangeSupport getPCS(){return pcs;}
}


class FilterAction extends AbstractAction{
      private ViewModel _model;

      public FilterAction(VIewModel model){
           model.getPCS().addPropertyChangeListener(new FilterListener());
           setEnabled(!model.isFiltered());
           _model = model;
      }

      public void actionPerformed(ActonEvent e){
           model.setFiltered(true);
      }

      class FilterListener implements PropertyChangeListener{
           public void propertyChange(PropertyChangeEvent e){
               setEnabled(!model.isFiltered());
           }
      }
}


Dit is iets wat de meeste mensen over het hoofd zien: view models!

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
M'n table is gebaseerd op een model dat extends van AbstractTableModel, waar ik een applyFilter en clearFilter in heb. Ik kan natuurlijk van uit m'n ApplyFilterAction niet aan die model.applyFilter().

Ik neem aan dat MVC hier ook aan te pas komt?
M = mijn table model
V = het view model dat ik moet maken?


(waarom begin ik te denken dat we echt wel veeeeeeeel te laat aan ons project begonnen zijn?)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Nephilim schreef op 30 December 2002 @ 14:59:
M'n table is gebaseerd op een model dat extends van AbstractTableModel, waar ik een applyFilter en clearFilter in heb. Ik kan natuurlijk van uit m'n ApplyFilterAction niet aan die model.applyFilter().
Je kan de tablemodel toch netjes aan die actie meegeven? En je zou oa mijn viewmodel bij jouw tablemodel kunnen onderbrengen. Dus alle dingen in de viewmodel ff in jouw tablemodel verplaatsen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class FilterAction extends AbstractAction{
      private JouwTableModel _model;

      public FilterAction(JouwTableModel model){
           model.getPCS().addPropertyChangeListener(new FilterListener());
           setEnabled(!model.isFiltered());
           _model = model;
      }

      public void actionPerformed(ActonEvent e){
           model.setFiltered(true);
      }

      class FilterListener implements PropertyChangeListener{
           public void propertyChange(PropertyChangeEvent e){
               setEnabled(!model.isFiltered());
           }
      }
}
(waarom begin ik te denken dat we echt wel veeeeeeeel te laat aan ons project begonnen zijn?)
:P

[ Voor 34% gewijzigd door Alarmnummer op 30-12-2002 15:07 ]


  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Tnx, ik denk dat ik het zelfs deels begrijp. De knoppen luisteren dus gewoon naar het model, verandert er iets in het model, laat het dit weten en reageren de knoppen daar op?

Ik zit nu wel met het problemen dat de knoppen mooi disabled worden, maar ik krijg ze niet meer enabled..

Effe een deel van m'n code online gezet:
http://www.nephilimco.com/nephilim/ApplyFilterAction.java
http://www.nephilimco.com/nephilim/ClearFilterAction.java
http://www.nephilimco.com...veranciersTableModel.java
http://www.nephilimco.com/nephilim/Main.java

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Nephilim schreef op 30 december 2002 @ 15:38:
Tnx, ik denk dat ik het zelfs deels begrijp. De knoppen luisteren dus gewoon naar het model, verandert er iets in het model, laat het dit weten en reageren de knoppen daar op?
precies :)
Ik zit nu wel met het problemen dat de knoppen mooi disabled worden, maar ik krijg ze niet meer enabled..
Je hebt bij de unfilter action denk ik een ! vergeten.
Je doet iets fout in de main. Waarom maak je iedere keer een nieuwe tablemodel aan? ;) Die kan je gewoon sharen tussen de actions en de table hoor. Anders lopen ze het verkeerde object te sorteren ;)

[ Voor 16% gewijzigd door Alarmnummer op 30-12-2002 15:47 ]


  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Alarmnummer schreef op 30 December 2002 @ 15:40:
[...]

Je hebt bij de unfilter action denk ik een ! vergeten.
Ik neem aan dat je deze lijn bedoeld? Ik neem aan dat dit juist is aangezien hij enabled (true) moet zijn, wanneer de lijst gefilterd (true) is?

Java:
30
setEnabled(_model.isFiltered());
Je doet iets fout in de main. Waarom maak je iedere keer een nieuwe tablemodel aan? ;) Die kan je gewoon sharen tussen de actions en de table hoor. Anders lopen ze het verkeerde object te sorteren ;)
Ik maak nu 1x het model aan, en geef dat dan door aan de Table, en de 2 Actions, maar hij doet nog niets :?

* Nephilim gaat toch maar terug COBOL programmeren, veel simpeler

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Nephilim schreef op 30 december 2002 @ 16:04:
[...]
Ik maak nu 1x het model aan, en geef dat dan door aan de Table, en de 2 Actions, maar hij doet nog niets :?
Post dat stukje code maar ff.. En daarna ga ik er ook echt vandoor :)
k neem aan dat je deze lijn bedoeld? Ik neem aan dat dit juist is aangezien hij enabled (true) moet zijn, wanneer de lijst gefilterd (true) is?
vergeet maar dat ik dat heb gezegd. Het kwam doordat ik eerst niet wist wat de fout was. De fout is dus echt dat je meerdere tablemodels aanmaakt.

Jij maakte er totaal 3 aan en je wil echt maar een.

[ Voor 39% gewijzigd door Alarmnummer op 30-12-2002 16:09 ]


  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Dit heb ik ervan gemaakt. Wel e.e.a. weggelaten voor de leesbaarheid.

Java:
1
2
3
4
5
6
7
8
9
10
11
LeveranciersTableModel tablemodel = new LeveranciersTableModel();

JTable table = new JTable(tablemodel);
JScrollPane scroller = new JScrollPane(table);


JButton search = new JButton();
search.setAction(new ApplyFilterAction(tablemodel));

JButton clear = new JButton();
clear.setAction(new ClearFilterAction(tablemodel));

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Java:
1
2
3
4
5
6
7
LeveranciersTableModel tablemodel = new LeveranciersTableModel();

JTable table = new JTable(tablemodel);
JScrollPane scroller = new JScrollPane(table);

JButton filterButton = new JButton(new ApplyFilterAction(tablemodel));
JButton unfilterButton = new JButton(new ClearFilterAction(tablemodel)));


Het kan nog wat korter, en probeer duidelijkere namen te geven. Met search en clear is niet meteen duidelijk dat dat buttons zijn. Ik probeer het laatste stuk van de naam het soort object te laten zijn (niet altijd, want zo nu en dan is het uit nature wel weer duidelijk)

Maar werkt het nu of niet?

[ Voor 15% gewijzigd door Alarmnummer op 30-12-2002 18:25 ]


  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Eum neen, het werkt dus nog steeds niet

edit:

http://www.nephilimco.com/nephilim/Suntec.zip
Hierin zitten denk ik alle classfiles die nodig zijn voor het runnen.
De .java files die van belang zijn, staan op de vorige urls.

[ Voor 72% gewijzigd door Nephilim op 30-12-2002 19:50 ]


  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Kan het zijn omdat ik die FilterListener 2x opnieuw maak, dus in elke Button?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Nephilim schreef op 30 december 2002 @ 20:59:
Kan het zijn omdat ik die FilterListener 2x opnieuw maak, dus in elke Button?
Dat maakt niet uit. Maar Pas dit nog even aan:

model.getPCS().addPropertyChangeListener(LeverTableModel.FILTERED,new FilterListener());

je moet natuurlijk wel naar 1 property luisteren, en niet naar alle properties :) (mijn fout)

En je hebt wel een fout gemaakt in de clearfilter action. Mijn vermoeden was correct, je hebt een ! vergeten (of te veel :P)

[ Voor 14% gewijzigd door Alarmnummer op 30-12-2002 21:10 ]


  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Het werkt! _/-\o_

En ik heb er maar een hele dag voor nodig gehad :D

Het is blijkbaar wel een principe dat belangrijk is. Ik vraag me echt af waarom ze dit er op school niet hebben ingestampt tot we aan niets anders meer denken.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Dat is idd een tekort koming aan hts`en. Er wordt naar mijn mening niet veel gedaan aan ontwerpen van code. Dit hoeft totaal niet taal specifiek te zijn dus het is ook geen vaardigheid met een beperkte houdbaarheids datum.

Ik raad je in ieder geval het GoF boek aan voor een eerste kennismaking met design patterns.

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Alarmnummer schreef op 30 december 2002 @ 21:50:
Dat is idd een tekort koming aan hts`en
Aan _wat_?
Ik raad je in ieder geval het GoF boek aan voor een eerste kennismaking met design patterns.
Heb ik al vaker horen noemen, misschien toch maar eens kopen dan. At least, als ik tegen eind dit schooljaar nog code kan zien :P

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

leren ontwerpen.
Heb ik al vaker horen noemen, misschien toch maar eens kopen dan. At least, als ik tegen eind dit schooljaar nog code kan zien :P
Als je serieus met oo bezig wil, dan moet dat boek gewoon in je kast staan (of een variant erop). Je krijgt grotere bouwstenen om in te denken en om mee te communiceren met anderen (vriendin, familie ed ;) )

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Eum voorlopig heb ik enkel het boek van Deitel & Deitel in m'n "kast" staan .. verplicht boek in school :)
Pagina: 1