[Java] Tekenen met Swing op een JPanel

Pagina: 1
Acties:

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Topicstarter
Hoi :)

Ik heb hier de volgende code:
Java:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 * Main.java
 *
 * Created on 6 juli 2007, 19:14
 *
 */

package pong;

import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author Administrator
 */
public class Main extends JFrame
{
    private hoofdPaneel hoofdPaneel;
    
    private Graphics paneelGraphics;
    
    /** Creates a new instance of Main */
    public Main()
    {
    this.setSize(500, 500);
        this.setResizable(false);
        this.setVisible(true);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    hoofdPaneel = new hoofdPaneel();
    this.getContentPane().add(hoofdPaneel);
    
    //werkt niet
    //hoofdPaneel.getGraphics().drawString("test2",250, 250);
    
    //doet het niet
    hoofdPaneel.tekenBalkje(hoofdPaneel.getGraphics());
    }


    private class hoofdPaneel extends JPanel
    {
    protected void paintComponent(Graphics g)
    {
        //werkt perfect
        g.drawString("test?", 25, 25);
        
    }
    
    public void tekenBalkje(Graphics g)
    {
        //doet het niet
        g.fillRect(36, 36, 36, 36);
    }
    }
        
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        Main main = new Main();
    }
}

mmmmm tabs staan niet correct.

Wat werkt er niet: Staat aangeduid in de code :)
Wat zou het moeten doen: Tekst of een balkje tekenen, dat ik gewoon iets kan tekenen op het hoofdPaneel, NADERHAND, als er eventueel op een knop is gedrukt :)

Wat heb ik gezocht: Kunnen jullie mij een zetje geven in de goede richting? :)

Going for adventure, lots of sun and a convertible! | GMT-8


Verwijderd

Doe in paintComponent. Elke keer dat je er iets moet veranderen roep je de repaint method van de JPanel aan. Dat mag geen probleem zijn.

Zie hier.

[ Voor 53% gewijzigd door Verwijderd op 07-07-2007 11:19 ]


  • Marcj
  • Registratie: November 2000
  • Laatst online: 02-12 15:16
Wat er nu waarschijnlijk gebeurt is dat je probeert om iets extern op een object te tekenen via getGraphics(), maar dat vlak daarna de paint() methode van dat object aangeroepen wordt, welke eerst een JPanel 'leeg' maakt. Wat je normaal altijd zou moeten doen om het goed te laten werken is de paintComponent(Graphics g) overschijven.

Als je dus iets van de text wilt wijzigen, geef je die tekst gewoon door aan je custom component en roep je repaint() aan. Deze zorgt ervoor dat de paint() methode (en daarmee de paintComponent() methode) zo snel mogelijk aangeroepen wordt.

Wat je dus nooit moet doen is extern van een JComponent de getGraphics() aanroepen en dan iets gaan tekenen, want de repaint() methode wordt bijvoorbeeld ook aangeroepen wanneer het venster vergroot/verkleind wordt.

  • Mammon
  • Registratie: December 2006
  • Laatst online: 23-11 13:55
en als je dit doet?
g.fillRect(36,36, 66,66);

is het iig wat beter zichtbaar

  • Marcj
  • Registratie: November 2000
  • Laatst online: 02-12 15:16
wouter.oet schreef op zaterdag 07 juli 2007 @ 11:19:
en als je dit doet?
g.fillRect(36,36, 66,66);

is het iig wat beter zichtbaar
De laatste twee argumenten zijn de breedte en de hoogte, hiermee vergoot je dus alleen het vierkantje, maar los je niets op. Je hoort gewoon niet op die manier iets te tekenen.

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Topicstarter
Marcj schreef op zaterdag 07 juli 2007 @ 11:26:
[...]


De laatste twee argumenten zijn de breedte en de hoogte, hiermee vergoot je dus alleen het vierkantje, maar los je niets op. Je hoort gewoon niet op die manier iets te tekenen.
Fijn dat je dat zegt, maar hoe moet ik het dan wel doeN?
Verwijderd schreef op zaterdag 07 juli 2007 @ 11:17:
Doe in paintComponent. Elke keer dat je er iets moet veranderen roep je de repaint method van de JPanel aan. Dat mag geen probleem zijn.

Zie hier.
Die website ben ik ook tegengekomen, maar deze loste het ook niet op, zoals je kan zien op 47 gebruik ik al paintComponent. Ik wil gewoon naderhand iets bijtekenen, en ik weet dus niet hoe dat dat gaat.

Going for adventure, lots of sun and a convertible! | GMT-8


  • Marcj
  • Registratie: November 2000
  • Laatst online: 02-12 15:16
Snake schreef op zaterdag 07 juli 2007 @ 11:27:
[...]

Fijn dat je dat zegt, maar hoe moet ik het dan wel doeN?
[...]

Die website ben ik ook tegengekomen, maar deze loste het ook niet op, zoals je kan zien op 47 gebruik ik al paintComponent. Ik wil gewoon naderhand iets bijtekenen, en ik weet dus niet hoe dat dat gaat.
Zoals ik ook in mijn eerste reactie probeer uit te leggen hoor je alles te tekenen in je paintComponent() methode! En je kunt natuurlijk allerlij manieren verzinnen om hier naderhand dingen aan te wijzigen (bijvoorbeeld een String bijhouden die je kunt wijzigen).

Zie bijvoorbeeld ook Deze Java2D tutorial.

  • Mammon
  • Registratie: December 2006
  • Laatst online: 23-11 13:55
Marcj schreef op zaterdag 07 juli 2007 @ 11:26:
[...]


De laatste twee argumenten zijn de breedte en de hoogte, hiermee vergoot je dus alleen het vierkantje, maar los je niets op. Je hoort gewoon niet op die manier iets te tekenen.
Dat wist ik niet. Maar ik bedoelde er eigenlijk mee aan te geven dat het slimmer is om een "groot"
vlakje te tekenen ipv een pixel. Want daar kijk je makkelijk over heen...

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Topicstarter
Marcj schreef op zaterdag 07 juli 2007 @ 11:33:
[...]

Zoals ik ook in mijn eerste reactie probeer uit te leggen hoor je alles te tekenen in je paintComponent() methode! En je kunt natuurlijk allerlij manieren verzinnen om hier naderhand dingen aan te wijzigen (bijvoorbeeld een String bijhouden die je kunt wijzigen).

Zie bijvoorbeeld ook Deze Java2D tutorial.
En hoe maak ik dan een bewegend balkje voor Pong? :)

Dat is eigenlijk wat ik hier wil verwezenlijken. Ofwel ben ik totaal verkeerd aan het zoeken.

[ Voor 8% gewijzigd door Snake op 07-07-2007 13:28 ]

Going for adventure, lots of sun and a convertible! | GMT-8


  • Doctor M.
  • Registratie: September 2004
  • Laatst online: 01-12 17:09
Wat dacht je van het balkje te tekenen in de paintComponent en met een y positie (een int variabele die veranderd als men een toets indrukt oid) het beginpunt aan te wijzen?

  • Marcj
  • Registratie: November 2000
  • Laatst online: 02-12 15:16
Ik ga er van uit als je Object georienteerd aan het ontwerpen bent geslagen dat je ook een object hebt die dat balkje representeerd. Als je nu twee balk-objecten toevoegd aan een custom JPanel dan kun je bij elke update opvragen waar die balkjes zich bevinden en ze dan tekenen. Hetzelfde kun je doen met een bal-object. Nu heb je drie objecten die je van buitenaf kunt wijzigen en bij elke wijziging kun je de panel die je wilt laten maken opnieuw laten tekenen.
Pagina: 1