Java Swing JPanel

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • akkaya
  • Registratie: Juli 2009
  • Laatst online: 08-04 12:55
Beste allemaal,

Ik heb een vraag/probleem en leg het kort uit. Ik ben sinds een paar dagen bezig met het leren van Swing dus ben geen guru :) Ik heb een gameboard met een JFrame die ik opvul met JPanels. Nu wil ik een panel op positie x selecteren en daar een label (speler) aan koppelen/toevoegen.

Even een stuk van de code... bord wordt gevuld met vakjes.
code:
1
2
3
4
5
6
7
8
9
//Vul contenpane met vakjes (panels)
        for(int r=0;r<RIJEN;r++){
            for(int k=0;k<KOLOMMEN;k++){
                vakje = new JPanel();
                vakje.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                vakje.setBackground(Color.WHITE);
                frame.getContentPane().add(vakje);
            }
        }


Stel ik wil zoiets doen:
code:
1
2
3
public void voegSpelerToe(Speler speler, int positie){
        frame.getContentPane().getComponent(positie).setBackground(Color.BLUE);
    }

Nu lukt het me wel om een willekeurige panel in mijn contentpane een kleurtje te geven, maar het lukt me maar niet om een label mee te geven. Ik wil bijvoorbeeld de panel op positie x een label geven. Hoe kan ik dit doen? Kan dit alleen wanneer ik de vakjes toevoeg en niet meer achteraf?

Acties:
  • 0 Henk 'm!

  • Domdo
  • Registratie: Juni 2009
  • Laatst online: 30-06 20:29
Dan ook tijdens runtime hoor, door bijvoorbeeld het volgende toe tevoegen.

Java:
1
frame.getContentPane().getComponent(positie).add(new JLabel("tekst")); 


Ik denk trouwens dat je met iets simpelers moet beginnen (of de vorige hoofdstukken toch maar wel even lezen ')

Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 19-09 14:23
Het lijkt me beter om een aparte JPanel klasse te maken en daar je Jlabels aan toe te voegen ipv elke keer een aparte container te maken voor je JLabels? :?

Acties:
  • 0 Henk 'm!

  • akkaya
  • Registratie: Juli 2009
  • Laatst online: 08-04 12:55
Domdo schreef op woensdag 08 juli 2009 @ 22:49:
Java:
1
frame.getContentPane().getComponent(positie).add(new JLabel("tekst")); 
Dit werkt niet volgens mij. Ik heb dit al geprobeerd omdat dit voor de hand ligt, maar ik krijg de volgende melding:

"The method add(PopupMenu) in the type Component is not applicable for the arguments(JLabel)"

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Ik ga er vanuit dat je meer met die JPanels gaat doen dan alleen een JLabel op zetten. Anders kun je net zo goed de JPanel (en subclass) er tussenuit laten en gewoon met JLabels aan de slag gaan als grid elements!

Maak ten eerste een JPanel subclass met daarin een JLabel. Noem die class bijvoorbeeld GridElementPanel:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class GridElementPanel extends JPanel {
  protected final JLabel label;

  public GridElementPanel() {
    setBorder(BorderFactory.createLineBorder(Color.BLACK));
    setBackground(Color.WHITE);

    label = new JLabel();
    add(label, BorderLayout.CENTER);
  }

  .. meer methods ..
}


Maak dan GridElementPanels aan zoals je nu JPanels aanmaakt, maar sla een reference naar de aangemaakte panel op in een 2d array:
Java:
1
2
3
  vakje = new GridElementPanel();
  gridElements[r][k] = vakje;
  frame.getContentPane().add(vakje);


Wanneer je nu de label van een bepaald vakje wilt zetten doe je gewoon het volgende:
Java:
1
gridElements[rij][kolom].setLabelText("wat tekst");


Moet je natuurlijk wel even de method setLabelText(String) in GridElementPanel aanmaken, maar ik ga natuurlijk niet alles voorschrijven :)

[ Voor 20% gewijzigd door Gerco op 08-07-2009 23:24 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • akkaya
  • Registratie: Juli 2009
  • Laatst online: 08-04 12:55
Bedankt voor de snelle reacties.

Ik zal er morgen verder aan werken. Het is laat geworden. Mocht ik er niet uitkomen dan meld ik me wel weer. Nogmaals bedankt.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
akkaya schreef op woensdag 08 juli 2009 @ 22:59:
[...]

Dit werkt niet volgens mij. Ik heb dit al geprobeerd omdat dit voor de hand ligt, maar ik krijg de volgende melding:

"The method add(PopupMenu) in the type Component is not applicable for the arguments(JLabel)"
De methode die je gebruikt geeft een java.awt.Component terug, deze heeft alleen een add(Popup) methode. Als je zeker weet dat het een JPanel is, zal je die eerst naar JPanel moeten casten voordat je JPanel methodes aan kunt roepen (of eigenlijk: java.awt.Container).

Overigens is het natuurlijk beter om zoals Gerco zegt dit iets meer object georiënteerd aan te pakken.

Acties:
  • 0 Henk 'm!

  • Neverwinterx
  • Registratie: December 2005
  • Laatst online: 12-09 10:56
Het lijkt erop dat je een soort van spelbord aan het tekenen bent met JPanels als vakjes. Een andere manier is door gewoon een JPanel als het hele bord te gebruiken en de vakjes te tekenen met methodes uit java.awt.Graphics2D zoals draw(Shape). Tekst kan je dan maken met drawString(...). Dit tekenen van het bord kan je doen door het overriden van de paintComponent(Graphics) van het JPanel dat het hele bord voorstelt ofzo.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Neverwinterx schreef op donderdag 09 juli 2009 @ 10:45:
Het lijkt erop dat je een soort van spelbord aan het tekenen bent met JPanels als vakjes. Een andere manier is door gewoon een JPanel als het hele bord te gebruiken en de vakjes te tekenen met methodes uit java.awt.Graphics2D zoals draw(Shape). Tekst kan je dan maken met drawString(...). Dit tekenen van het bord kan je doen door het overriden van de paintComponent(Graphics) van het JPanel dat het hele bord voorstelt ofzo.
Hij zou de vakjes ook als JButton kunnen toevoegen. Dan kun je naast tekst ook makkelijk een icon toevoegen en een actionlistener hangen aan de knop.

Acties:
  • 0 Henk 'm!

  • akkaya
  • Registratie: Juli 2009
  • Laatst online: 08-04 12:55
Neverwinterx schreef op donderdag 09 juli 2009 @ 10:45:
Het lijkt erop dat je een soort van spelbord aan het tekenen bent met JPanels als vakjes. Een andere manier is door gewoon een JPanel als het hele bord te gebruiken en de vakjes te tekenen met methodes uit java.awt.Graphics2D zoals draw(Shape). Tekst kan je dan maken met drawString(...). Dit tekenen van het bord kan je doen door het overriden van de paintComponent(Graphics) van het JPanel dat het hele bord voorstelt ofzo.
Dat is inderdaad wat ik wil bereiken. Het is een soort speelbord van vakjes en op die vakjes willen ik later pionnen plaatsen van spelers en deze wil ik kunnen verplaatsen en ze moeten bijvoorbeeld de naam van de speler kunnen tonen (dmv label?).

@All
Ik heb vorig jaar het SCJP certificaat behaald, maar echte praktijkervaring heb ik niet. Ik wil leren aan de hand van opdrachten en dit is er een van. Ik vind het leuk om te doen en hoop zo beetje bij beetje mijn kennis te vergroten. Zo ben ik pas sinds een paar dagen bezig met Swing, maar echt moeilijk lijkt het me niet. Natuurlijk moet ik wel veel leren, maar met een beetje oefenen en "spelen" leer ik het beste.

Even beknopt over hoe ik het wil doen. Ik heb bijvoorbeeld een class vakje die erft (extends) van JPanel. Ik heb een class speelbord die vakjes bevat (composition). Ik maak een frame aan voor het bord en vul deze met vakjes (rijen,kolommen). Na het vullen van deze vakjes wil ik toegang tot diverse vakjes om een pion hierop te kunnen plaatsen en ik moet deze kunnen verplaatsen.

Ik denk dat ik hier het beste het voorstel van Gerco kan gebruiken? Of kan het op een andere (betere) manier?

Acties:
  • 0 Henk 'm!

  • akkaya
  • Registratie: Juli 2009
  • Laatst online: 08-04 12:55
Even nog een vraagje:

Ik heb een class Speler en een class Pion. Elke speler heeft een aantal pionnen en elke pion heeft een id en een waarde. Hoe kan ik dit het beste meegeven in de class Speler? Als een collection (HashSet?) van pionnen? Of gewoon als een array die pionnen bevat?

Java:
1
2
3
4
5
Set<Pion> pionnen = new HashSet<Pion>();

//of gewoon een array

Pion[] pionnen;


Btw. Ik wil dat elke speler evenveel pionnen heeft in het begin en dat een pion verplaatsbaar is over het veld met vakjes en ook verwijderbaar. En er mag maar 1 pion op een vakje staan.

edit: Ik heb gekozen voor een ArrayList.

[ Voor 3% gewijzigd door akkaya op 12-07-2009 16:56 ]


Acties:
  • 0 Henk 'm!

  • Domdo
  • Registratie: Juni 2009
  • Laatst online: 30-06 20:29
Verder maakt het weinig uit hoe je Pionnen gaat bijhouden in de classe speler. Volgens mij hoef je geen andere functionaliteit dan het bewaren (en uitlezen) van Pionnen in de class Speler.

p.s.
Ik zou een Pion een eigenaar meegeven en dan alle pionnen gaan bijhouden in een andere classe (bijv. Spel) en dan de class Spel het pionnen verplaatsen laten regelen.

Acties:
  • 0 Henk 'm!

  • akkaya
  • Registratie: Juli 2009
  • Laatst online: 08-04 12:55
Weer een vraagje.

Ik heb het eea gelezen over MVC (Model View Controller). Nu begrijp ik dat Swing zelf MVC gebruikt, maar ik hoeverre zou ik dit model kunnen/moeten toepassen voor zo een applicatie als de mijne? Ik kan nergens een goede tutorial vinden over hoe dit toe te passen op een simpel java programma. Iemand tips/ideeën?

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Wil je dat het spring is of niet?

Zo ja hier simpel dingetje.

Hoe je het op je eigen programma moet toepassen moet je kijken in hoeverre je de business logica (regels) kan scheidden van de view (je daadwerkelijke presentatie). De communicatie tussen en statussen van je objecten kan je dan regelen in "het middenstuk", de controller. Ook doe je meestal je berekeningen in de controller..

Het model is eigenlijk een simpele representatie van de informatie waarmee de applicatie werkt. (POJO's DAO's etc etc) Eventueel is dat weer te persisteren met een DB maar deze laag hoeft niet per definitie bij de het model te horen kan ook aparte datalaag zijn.

[ Voor 27% gewijzigd door Bl4ckviper op 20-07-2009 23:14 ]

Be fast .... Be furious....

Pagina: 1