[Java][Beginner] Knoppen groeperen?

Pagina: 1
Acties:

  • Potatoman
  • Registratie: September 2000
  • Laatst online: 13-09 12:17
Ik wil graag het stukje code om een knop te maken 20 keer herhalen:

b1 = new Button("o");
add(b1);
b1.addActionListener(this);
b1.setBounds(590,0,70,20);

In plaats van dit twintig keer in te typen wil ik graag een class maken die automatisch 20 van deze buttons voor mij maakt, maar dit lukt mij nog niet echt :'(

The cyclographing developer


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

Alarmnummer

-= Tja =-

met een for lus kun je een x aantal keer herhalen..

je zou dan afhankelijk vind de index (van je itterator) de positie van iedere knop kunnen bepalen.

Maar werken met posities op deze manier is niet zo geweldig, ik denk dat jij wel een Box kan gebruiken :)

http://java.sun.com/j2se/1.4/docs/api/javax/swing/Box.html

  • Potatoman
  • Registratie: September 2000
  • Laatst online: 13-09 12:17
Op dinsdag 29 januari 2002 16:43 schreef Alarmnummer het volgende:
met een for lus kun je een x aantal keer herhalen..

je zou dan afhankelijk vind de index (van je itterator) de positie van iedere knop kunnen bepalen.

Maar werken met posities op deze manier is niet zo geweldig, ik denk dat jij wel een Box kan gebruiken :)

http://java.sun.com/j2se/1.4/docs/api/javax/swing/Box.html
Maar hoe doe ik dat met een for-lus? Kan ik dan nog wel elke afzonderlijke knop uitzoeken met de actionlistener?
Want volgens mij krijg ik dan gewoon 20 knoppen met de naam b1, tenzij er een andere manier is natuurlijk.

The cyclographing developer


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

Alarmnummer

-= Tja =-

En addActionListener(this) is erug vervelend :) beetje Visual Cafe Style :)


vb hoe het anders kan.
code:
1
2
3
4
5
6
7
8
9
10
11
class ButtonAction extends AbstractAction{
   private int buttonIndex;

   public ButtonAction(int buttonIndex){
    this.buttonIndex = buttonIndex;
   }

   public void actionPerformed(ActionEvent ae){
     System.out.println("button:"+buttonIndex+" is ingedrukt.");
   }
}

En je kan hem als volgt toevoegen aan je action:

button21.setAction(new ButtonAction(21));


Dit is beter dan een algemene ActionListener (zoals jij die hebt). Ik neem aan dat je Frame de actionListener is en je zoiets hebt:
code:
1
2
3
4
5
6
7
8
public void actionPerformed(ActionEvent ae){
   Object source = ae.getSource();
   if(source == button1){
    ...
   }else if(source == button2){
    ...
   }etc etc
}

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

Alarmnummer

-= Tja =-

Je zou zoiets kunnen doen:
code:
1
2
3
4
for(int k=0;k<20;k++){
   JButton button = new JButton(new ButtonAction(k));
   ...voeg hem ergens aan toe :)
}

Als je de buttons heel eenvoudig in een matrix wilt hebben zou je ze ook in een TableLayout kunnen plaatsen:
http://java.sun.com/products/jfc/tsc/articles/tablelayout/

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik zou eerst eens naar wat eenvoudige LayoutManagers kijken om zo absolute positionering af te leren.... Pak eens een GridLayout of een BorderLayout :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

b1 = new Button("o");
add(b1);
b1.addActionListener(this);
b1.setBounds(590,0,70,20);

In plaats van dit twintig keer in te typen wil ik graag een class maken die automatisch 20 van deze buttons voor mij maakt, maar dit lukt mij nog niet echt :'(
Dit kan inderdaad handiger (mits er op elke knop een evenlange tekst komt te staan). Je maakt, zoals al gezegd werd, een for loop. Je voegt elke knop toe aan een panel, die je van te voren declareert, en dan maakt het niet uit hoe de knop zelf heet. Uiteindelijk krijg je dan een panel met daaraan toegevoegd 20 knoppen. Door de panel dan zelf weer toe te voegen met this.add(panel_naam); zijn al je knoppen toegevoegd.

De code komt er dan ongeveer zo uit te zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Panel knoppen;
Button knop;
String opschrift, opschrift_knop;
int n;

// hieronder kun je dus zelf je eigen opschrift neerzetten

opschrift = "abcdefghijklmnopqrst";

knoppen = new Panel();
knoppen.setLayout( new GridLayout(5, 5, 10, 10));

for (n=0; n<20; n++)
{
opschrift_knop = opschrift.substring(n, n+1)
knop = new Button(opschrift_knop);
knop.addActionListener(this);
knoppen.add(knop);
}

this.add(knoppen);

Nu zul je 20 knoppen krijgen (een met opschrift 'a' een met 'b' etc. Deze knoppen zijn allemaal volgens een gridlayout, kan ook een andere layout nemen, aan de panel knoppen toegevoegd, die zelf weer aan de applet wordt toegevoegd met this.add(knoppen);

Omdat de knoppen allemaal dezelfde naam hebben, kun je ze alleen achterhalen door te kijken wat het label van de knop is. Dus in de methode actionPerformed kan iets dergelijks komen te staan (moet de methode wel alleen door knoppen kun worden aangeroepen).
code:
1
2
3
4
5
6
7
8
9
10
11
12
public void actionPerformed(ActionEvent e)
{
Button b;
String s;

b = (Button) (e.getSource());
s = b.getLabel();

if (s.equals("iets")
{
//doe iets nuttig etc.
}

al met al is dit dus een beetje omslachtig maar het kan wel. Dus je moet maar zien of je dit of ctrl c en v'en handiger vindt :)

Succes!

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

Alarmnummer

-= Tja =-

Op dinsdag 29 januari 2002 16:59 schreef mbravenboer het volgende:
Ik zou eerst eens naar wat eenvoudige LayoutManagers kijken om zo absolute positionering af te leren.... Pak eens een GridLayout of een BorderLayout :) .
Ik denk dat een Box in dit geval wel makkelijk is. Vooral als hij ze alle 20 naast elkaar of onder elkaar wil hebben.

Box is een panel met een horizontal of vertical flowlayout.

(Je had ook net zo goed meteen vertical of horizontal flow layout kunnen instellen bij de panel waar dit op komt) :)

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

Alarmnummer

-= Tja =-

Op dinsdag 29 januari 2002 17:08 schreef Breakout het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
public void actionPerformed(ActionEvent e)
{
Button b;
String s;

b = (Button) (e.getSource());
s = b.getLabel();

if (s.equals("iets")
{
//doe iets nuttig etc.
}
Ieks een check op label inhoud :)

Advies... DOE DIT NIET!! :)

reden
1. keuzen nemen op basis van iets visueel is very bad programming omdat je de label wel eens zou kunnen aanpassen en en je programma niet meer werkt.
2. je gebruikt een algemene actionListener en dat doen we al jaren niet meer :) Ten 1e is dit super traag en ten 2e is het erg lastig te onderhouden. Je kan veel beter met een Action doet.
3. het word lachen als je meerdere soorten componenten op je scherm krijgt die ook een actionListener nodig hebben.

je krijgt dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void actionPerformed(ActionEvent ae){
  Object source = ae.getSource();
  if(source instanceof JButton){
    actionPerformedJButton(ae);
  }else if(source instanceof JTextField){
    actionPerformedJTextField(ae);
  }else
     ...
}

public void actionPerformedJButton(ActionEvent ae){
   JButton button = (JButton)ae.getSource();
   if(button.getLabel().equals('1'){
   }else{
     ...
}

public void actionPerformedJButton1(ActionEvent ae){
   System.out.println("button 1 is pressed.");
}

Ik weet nu meteen weer waarom ik in het begin een hekel had aan java gui programmeren :+

  • Potatoman
  • Registratie: September 2000
  • Laatst online: 13-09 12:17
Op dinsdag 29 januari 2002 17:12 schreef Alarmnummer het volgende:

[..]

Ieks een check op label inhoud :)

Advies... DOE DIT NIET!! :)

reden
1. keuzen nemen op basis van iets visueel is very bad programming omdat je de label wel eens zou kunnen aanpassen en en je programma niet meer werkt.
2. je gebruikt een algemene actionListener en dat doen we al jaren niet meer :) Ten 1e is dit super traag en ten 2e is het erg lastig te onderhouden. Je kan veel beter met een Action.
Ik wou net gaan zeggen dat dit mij een goede oplossing leek, maar als boxes beter zijn dat wil ik dat wel gebruiken. Maar kan je me dan iets meer uitleg geven hoe de actionlistener hiervan eruitziet?

The cyclographing developer


Verwijderd

Dan lees ik ook even mee :)

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

Alarmnummer

-= Tja =-

Op dinsdag 29 januari 2002 17:16 schreef Potatoman het volgende:

[..]

Ik wou net gaan zeggen dat dit mij een goede oplossing leek, maar als boxes beter zijn dat wil ik dat wel gebruiken. Maar kan je me dan iets meer uitleg geven hoe de actionlistener hiervan eruitziet?
Je moet niet zozeer een ander component (JFrame bv) naar die button laten luisteren. Dus in jouw geval laat je die box niet naar die button luisteren.

Je moet die ButtonAction zien als een object die naar 1 specifieke Button kan luisteren. Want je creeerd voor iedere button ook 1 buttonAction. Dus als jij 20 buttons hebt dan heb je ook 20 ButtonActions nodig.

Maar voordat we jouw probleem helemaal uit gaan werken moet je er eerst zelf even mee spelen. Daar leer je tenslotte het meeste van. :)

En met de code die ik je gegeven heb kan je het probleem al helemaal uitwerken.

Tip: Ga dus geen grafisch component naar die JButton laten luisteren. Dit is over het algemeen bad practice.

  • Potatoman
  • Registratie: September 2000
  • Laatst online: 13-09 12:17
Op dinsdag 29 januari 2002 17:25 schreef Alarmnummer het volgende:

[..]

Je moet niet zozeer een ander component (JFrame bv) naar die button laten luisteren. Dus in jouw geval laat je die box niet naar die button luisteren.

Je moet die ButtonAction zien als een object die naar 1 specifieke Button kan luisteren. Want je creeerd voor iedere button ook 1 buttonAction. Dus als jij 20 buttons hebt dan heb je ook 20 ButtonActions nodig.

Maar voordat we jouw probleem helemaal uit gaan werken moet je er eerst zelf even mee spelen. Daar leer je tenslotte het meeste van. :)

En met de code die ik je gegeven heb kan je het probleem al helemaal uitwerken.

Tip: Ga dus geen grafisch component naar die JButton laten luisteren. Dit is over het algemeen bad practice.
Ok, ik zie dat je ook HIO doet aan de hanze (me 2, eerstejaars :) ), dan zal je dit ook wel gehad hebben.

The cyclographing developer


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

Alarmnummer

-= Tja =-

Op dinsdag 29 januari 2002 17:54 schreef Potatoman het volgende:

[..]

Ok, ik zie dat je ook HIO doet aan de hanze (me 2, eerstejaars :) ), dan zal je dit ook wel gehad hebben.
En jij hebt net je kleine stage gedaan of moet hem nog doen? :) Ik krijg zometeen 2 2e jaars stagaires en 2 3e jaars van de hanze. En ik ben er ff een jaartje tussen uit :) Nog half jaar en afstudeerscriptie afronden en ik ben klaar! :)

Tip: als je goed wilt leren proggen moet je meer doen dan alleen op school word gegeven.

  • Potatoman
  • Registratie: September 2000
  • Laatst online: 13-09 12:17
Op dinsdag 29 januari 2002 17:57 schreef Alarmnummer het volgende:

[..]

En jij hebt net je kleine stage gedaan of moet hem nog doen? :) Ik krijg zometeen 2 2e jaars stagaires en 2 3e jaars van de hanze. En ik ben er ff een jaartje tussen uit :) Nog half jaar en afstudeerscriptie afronden en ik ben klaar! :)

Tip: als je goed wilt leren proggen moet je meer doen dan alleen op school word gegeven.
Ik heb nog helemaal niks van stage gehoord, volgens mij begint dat pas in het tweede jaar. Heb je er BTW 4 jaar of langer over gedaan, en vond je het erg moeilijk?

The cyclographing developer


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

Alarmnummer

-= Tja =-

Op dinsdag 29 januari 2002 18:17 schreef Potatoman het volgende:

[..]

Ik heb nog helemaal niks van stage gehoord, volgens mij begint dat pas in het tweede jaar. Heb je er BTW 4 jaar of langer over gedaan, en vond je het erg moeilijk?
De opleiding is niet zo moeilijk, maar in die schoolbankjes zitten wel :) Ik dacht dat je in het 2e jaar zat :)

dit is trouwens het project waar we mee bezig zijn:
http://129.125.172.114
maar je kan het nog niet starten omdat de jars nog niet gesigned zijn :)
Pagina: 1