Mapping buttons naar class objecten

Status
Niet open voor verdere reacties.

marcel222

Gebruiker
Lid geworden
6 dec 2008
Berichten
10
Hallo,

Ik heb even een vraag over het mappen van buttons naar class objecten.

Ik heb het volgende probleem, ik heb 100 buttons die ik wil koppelen aan overeenkomstige class objecten van een zelf gecreerde class.

In C++ heb ik dat een keer opgelost met een map<key, value> waarbij de key de pointer naar de button is en de value een pointer naar het overeenkomstige object. Op deze manier kon ik dus de GUI koppelen aan mijn klassen.
Voor elke button riep ik dan een gemeenschappelijke functie aan die een referentie naar het button object die was ingedrukt meekreeg, deze zocht ik op in mijn map en ik had de referentie naar het overeenkomstige object gevonden.

Nu is het in Java vereist dat de key of value "Comparable" is en blijkbaar is jButton dat niet, dus ik vroeg mij af hoe jullie zo'n probleem oplossen.
Is dit wel een goede methode of zijn er ook snellere en betere methoden om buttons te mappen aan objecten?

Alvast bedankt voor de reactie,

Marcel
 
You wanna do what to the who now? 100 buttons?:eek:
Waarom?
Afin je kan natuurlijk gewoon zelf een button aanmaken

Code:
import javax.swing.JButton;


public class MyComparableJButton extends JButton implements Comparable{

	String name;

	public int compareTo(Object o) {
		return name.compareTo(((MyComparableJButton)o).name);
	}
}

Als ik weet wat je juist wilt doen kan ik misschien wel een iets betere oplossing aanreiken.

PS: als je compareTo aanpast kan je best ook equals en hashcode overschrijven.
 
Laatst bewerkt:
Hoi GAB,

Wat ik wil maken is een applicatie waarbij de status van kluisjes (Lockers) wordt gemonitord op een PC, de PC is via een netwerk verbonden met elk van deze kluisjes.
Degene die achter de PC zit ziet nu een scherm met 100 buttons waarbij elke button een naam van een kluisje heeft, de status van het kluisje (open/gesloten) wordt middels een update functie continue geupdate en de kleur van de button geeft dan aan wat de status van het kluisje is.

De persoon achter de PC ziet nu dus in 1 oogopslag wat de status is van alle kluisjes, als hij nu details over het kluisje wil opvragen (zoals netwerkadres, PIN code etc) dan klikt hij gewoon op de button van het betreffende kluisje, hierdoor hoeft hij dus niet het nummer van het kluisje in te tikken, vandaar dus die 100 buttons.

Nu moet elke button natuurlijk worden gekoppeld aan de gegevens van dat kluisje (1 op1 relatie), normaal deed ik dit mappen altijd via een Map (C++) of TreeMap in Java, maar ik moet dan handmatig de buttonnamen veranderen.

Je krijgt dan zoiets en dan voor alle 100 buttons (deze code werkt echter niet omdat jButton niet comparable is). LockerSegment is hierbij een klasse die 100 instanties van de klasse Locker bevat is 1 segment, lockerSegment is de instantie en de functie getLockerDetails geeft een referentie terug naar een Locker object.
Code:
int index = 1;

lockerButtonMap.put(jButton2, lockerSegment.getLockerDetails(index++))
lockerButtonMap.put(jButton3, lockerSegment.getLockerDetails(index++))
lockerButtonMap.put(jButton4, lockerSegment.getLockerDetails(index++))
lockerButtonMap.put(jButton5, lockerSegment.getLockerDetails(index++))

Nu moet hier een simpelere oplossing voor zijn, ik kan echter geen loop gebuiken omdat ik de naam van jButton niet kan ophogen (naar mijn weten) dus dit gaat dan niet:
Code:
for(int i = 1: i <= 100; i++) {
   lockerButtonMap.put(jButton[B]i[/B], lockerSegment.getLockerDetails([B]i[/B]))
}

Ik heb de buttons al gecreerd dus mijn vraag is nu hoe kan ik op een simpele manier buttons koppelen aan objecten van een eigen klasse (dus een button aan 1 instantie van de klasse Locker), als de buttons al zijn gecreerd?
Als de buttons namelijk nog niet zijn gecreerd kan ik deze natuurlijk run-time creeren middels een loop en dan gelijk de Treemap vullen, ik wil het echter oplossen wanneer de buttons al zijn gecreerd.
 
Laatst bewerkt:
Wederom overerving... Maak een button aan die een Locker heeft, in eerste instantie is die null en doe je er niets mee maar op een gegeven ogenblik doe je dan setLocker(Locker locker) en nu kan je dus alles doen. Maar eigenlijk is dit nog steeds onlogisch waarom zou je een button hebben waar geen locker aan vast hangt. Ik heb even de vrijheid genomen om snel iets in elkaar te steken waar alle functionaliteit insteekt omdat het anders wat moeilijk werd om uit te leggen. (als je de extensie zip van de attachement veranderd naar jar en dubbelklikt gaat het ook gewoon werken). Bekijk eens of je er wat mee bent...
 

Bijlagen

Kan je niet beter zoiets doen. Je maakt een nieuwe soort knop aan.

Code:
public class LockerButton extends JButton {

private int lockerNumber 

public LockerButton(int lockerNumber) {
    super("Locker " + lockerNumber);  //dit wordt de naam van je knop
}

public int getLockerNumber() {
     return lockerNumber;
}

100 knoppen aanmaken gaat nu heel makelijk:

Code:
for (int i = 0; i < 100; i++) {
    LockerButton knop = new LockerButton(i);
    panel.add(knop);
}

En in je actionListener, kan de van je event e.getSource() casten naar LockerButton en dan kan je gewoon getLockerNumber() doen om te weten welke locker is ingedrukt...

Je kan je knop LockerKnop nog veel meer extra functie geven. Zou zou je je knop ook kunnen laten luisteren naar status verandering van je kluisje.

Als je ooit nog 200 kluisje krijgt hoef je maar 1 regel aan te passen nml waar je knopen aanmaakt.:)
 
GAB, bedankt voor het voorbeeld.
Skinflowers: het bepalen van de knoppen heb ik inderdaad via een actionListener geimplementeerd, dit werkt prima. Deze bepaalt eerst welke button is ingedrukt zoekt deze dan op en haalt de state op welke ik middels een State Pattern heb geimplementeerd.

Maar bij beiden oplossingen zie ik een nieuwe subclass van JButton, stel nu dat ik de JButtons al heb aangemaakt kan ik dan in de IDE (Netbeans) de klas van de button wijzigen naar de subclass die ik dan aanmaak voor de button, zoals jullie beiden voorstelde?
Of moet ik eerst de nieuwe subclass van JButton creeren en daarna de buttons aanmaken?
 
Maar bij beiden oplossingen zie ik een nieuwe subclass van JButton, stel nu dat ik de JButtons al heb aangemaakt kan ik dan in de IDE (Netbeans) de klas van de button wijzigen naar de subclass die ik dan aanmaak voor de button, zoals jullie beiden voorstelde?
Of moet ik eerst de nieuwe subclass van JButton creeren en daarna de buttons aanmaken?
Ja, aangezien het een JButton blijft en je er dus nog alles mee kunt doen wat je met een JButton kunt doen. Trouwens netbeans gaat je proper aangeven waar er eventueel toch nog wat code moet gewijzigd worden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan