layout lukt niet (java)

Status
Niet open voor verdere reacties.

askim

Gebruiker
Lid geworden
14 dec 2005
Berichten
17
Ik heb even hulp nodig. Kan iemand mij hierbij helpen?

Ik ben bezig met het programmeren van een programma 'tafels oefenen'. Ik kan er alleen niet voor zorgen dat ik het gewenste layout resultaat krijg.

Het moet gewoon 10 bij 10 knoppen worden. Het zit nu door elkaar.

Ik heb het volgende geprogrammeerd:

*****************************************************************

import java.awt.*;
import java.applet.*;


public class Layout extends Applet {

Button [ ] [ ] knoppenRij;
int i,j;

public void init() {

knoppenRij = new Button [10][10];

for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
knoppenRij[j]=new Button(""+(i+1)+" * "+ j);
add(knoppenRij[j]);
}
}


}
}
 
Je kunt volgens mij gewoon een GridLayout op je Applet plaatsen. Die kun je dan instellen op het formaat 10x10 en de knoppen op de goede plaatsen toevoegen.
 
Ik heb daar nog nooit mee gewerkt, hoe moet ik dat precies doen?
 
Heel erg bedankt, maar dat kan je dus ook gewoon gebruiken als je de knoppen in een array hebt staan?
 
Ja, je kunt gewoon je eigen code gebruiken. Je hoeft alleen nog maar
Code:
setLayout(new GridLayout(10,10));
toe te voegen.
 
Tnxxx, dat is 'm idd!!!

Ik had alleen nog een vraagje als het kan :D

ik heb de knoppen van 1*0 t/m 1*9 terwijl het 1*1 t/m 1*10 moet zijn. Maar het lukt mij niet om dat te doen. Wanneer ik <10 of >1 doe dan krijg ik ook iets anders dan ik moet hebben.
 
Nu begin je bij 0, waardoor je 1 * 0 krijgt. Makkelijker is om in de loop bij 1 te beginnen en dan t/m 10 door te gaan, dus:
Code:
for(int i=1; i<=10; i++){
     for(int j=1; j<=10; j++){
          knoppenRij[i][j]=new Button(""+i+" * "+ j);
          ...
     }
}

edit: denk er dus ook aan om in de naam van de knoppen gewoon i en j te gebruiken en geen (i+1) of iets dergelijks.
 
Ehum,

Ik heb het in mijn programma gezet, maar nu klopt het helemaal niet meer :( Layout doet het niet en ook niet dat het bij 1 x 1 begint en bij 10 x 10 eindigd.

Kan je me nogmaals helpen?

Want ik heb niet alleen knoppenRij [ ] [ ] maar ook antwoordRij [ ] [ ]


Ik zet ff al mijn code hier neer.

import java.awt.*;
import java.applet.*;
import java.awt.event.*;


public class Tafels extends Applet {

Button [][] knoppenRij;
int[][] antwoordRij;
TextField tekstvak;
Button knop;
int i,j,a,b;

public void init()

{

tekstvak = new TextField (12);
tekstvak.addActionListener(new VakHandler());

antwoordRij=new int[10][10];

for (i=0;i<10;i++)
{
for (j=1;j<10;j++)
{
antwoordRij[j]= (1+i)*j;
}
}

knoppenRij = new Button [10][10];

for (i=1;i<10;i++)
{
for (j=1;j<10;j++)
{
knoppenRij[j]=new Button(""+(i+1)+" * "+ j);
add(knoppenRij[j]);
}
}

knop=new Button ("keuze");
knop.addActionListener(new KnopHandler());
add(knop);
add(tekstvak);

}

public void paint(Graphics g)

{

}

class KnopHandler implements ActionListener
{
public void actionPerformed (ActionEvent e)
{

a=(int)(10*Math.random()+1);
b=(int)(10*Math.random()+1);

knoppenRij[a].setBackground(Color.green);

}
}

class VakHandler implements ActionListener
{
public void actionPerformed (ActionEvent e)
{
String invoerstring1 = tekstvak.getText();
int antwoord = Integer.parseInt(invoerstring1);

if (antwoord==antwoordRij[a])
tekstvak.setText("goed");
else tekstvak.setText("fout");

}
}
}
 
Ik heb even wat geprobeerd. Je moet het zelf nog maar wat beter maken. Als je bijvoorbeeld iets anders dan een getal invoert in het textfield gaat het nog niet helemaal goed.

Code:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Tafels extends Applet {

	Button [][] knoppenRij;
	int[][] antwoordRij;
	TextField tekstvak;
	Button knop;
	int a,b;
	Panel pan = new Panel();
	
	public void init(){
		pan.setLayout(new GridLayout(10,10));
		add(pan);
	
		tekstvak = new TextField (12);
		tekstvak.addActionListener(new VakHandler());
	
		antwoordRij=new int[10][10];
	
		for (int i=0;i<10;i++){
			for (int j=0;j<10;j++){
				antwoordRij[i][j]= (i+1)*(j+1);
			}
		}
	
		knoppenRij = new Button [10][10];
		for (int i=0;i<10;i++){
			for (int j=0;j<10;j++){
				knoppenRij[i][j]=new Button(""+(i+1)+" * "+ (j+1));
				pan.add(knoppenRij[i][j]);
			}
		}
	
		knop=new Button ("keuze");
		knop.addActionListener(new KnopHandler());
		add(knop);
		add(tekstvak);
	}
	
	//public void paint(Graphics g){}
	
	class KnopHandler implements ActionListener{
		
		public void actionPerformed (ActionEvent e){
			a=(int)(10*Math.random()+1);
			b=(int)(10*Math.random()+1);
			knoppenRij[a][b].setBackground(Color.green);
		}
	}
	
	class VakHandler implements ActionListener{
		public void actionPerformed (ActionEvent e){
			String invoerstring1 = tekstvak.getText();
			int antwoord = Integer.parseInt(invoerstring1);
	
			if (antwoord==antwoordRij[a][b])
				tekstvak.setText("goed");
			else tekstvak.setText("fout");
		}
	}
}
 
HEEL ERG BEDANKT!

Nu ziet het er idd veel beter uit.

Ik zal het even uitzoeken hoe dat precies moet. Dat je dus niet iets anders moet invoeren dan cijfers.

Ik heb dan nog een ALLERLAATSTE vraagje :D

Wanneer je dus op de knop 'keuze' klikt wordt een ander vakje geselecteerd met een groene kleur. En dat gaat telkens zo door tot alle knopjes groen zijn geworden.

Maar hoe kan ik het zo doen dat hij iedere keer maar 1 knop selecteerd. Dat de vorige weer grijs wordt en een ander weer groen en zo door blijft gaan. Dan houdt het programma ook niet op.
 
Je kunt de knop onthouden die je ervoor groen gekleurd hebt. Als je dan een andere knop gaat kleuren kun je de kleur van de eerste knop weer terugzetten.

Voor een controle of er wel een cijfer is ingevoerd moet je kijken naar de NumberFormatException. Die wordt namelijk gegooid als je de methode Integer.parseInt(...) uitvoert en er geen nummer staat.
 
Je kleurt een knop met de code:
knoppenRij[a].setBackground(Color.green);

Dan weet je dus dat de knop 'knoppenRij[a]' gekleurd is. De variabelen 'a' en 'b' staan nog op de waarden van die knop. Voordat je in actionPerformed(...) van KnopHandler de waarden opnieuw gaat bepalen zet je de kleur van 'knoppenRij[a]' dus terug.
 
Kan je die ook voorkouwen? Want het lukt niet echt, en dat is het laatste wat ik nog moet doen :(

Want waarschijnlijk kan je niet reset(): doen of iets zoals knoppenRij[a].setBackground(); ???
 
Vóór de code:
Code:
a=(int)(10*Math.random()+1);

			b=(int)(10*Math.random()+1);

			knoppenRij[a][b].setBackground(Color.green);
krijg je dan:
Code:
knoppenRij[a][b].setBackground(knop.getBackground());
 
nogmaals erg bedankt,

hij doet het nu helemaal naar behoren, alleen na een paar keer op nieuw klikken stopt het programma, dus op een gegeven moment wordt er geen knop meer geselecteerd. en dan moet ik het programma helemaal opnieuw opstarten, waar zou dat aan kunnen liggen?
 
Volgens mij ligt dat aan je code om een willekeurige knop groen te kleuren. Math.random() levert een double op tussen 0.0 en 1.0. Als je die met 10 vermenigvuldigt en er dan ook nog 1 bij optelt dan kan het zijn dat a de waarde 10 of groter krijgt. De array knoppenrij is echter maar 10 bij 10, dus van 0 t/m 9, waardoor je een ArrayIndexOutOfBoundsException krijgt. Het programma stopt dan inderdaad.

Je kunt voor de random keuze van een knop beter de methode Random.nextInt(10) gebruiken. Dit levert gelijk een int op tussen 0 en 10 (maar zonder de 10!) en zal dus wel werken.
 
Ik heb het volgende geprobeerd, maar het lukt niet.

Ik heb wel dit gedaan:

Random random;

random = new Random ();

en vervolgens:

a=(int) (random.nextInt(10));

b=(int) (random.nextInt(10));
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan