/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Auto-opdatering af tegning
Fra : Janus


Dato : 26-07-05 13:06

Hej NG!
Har lige siddet og lavet en lille tegning vha Graphics2D'et fra et
JPanel. På dette JPanel har jeg sat setPrederredSize(800,600) og er
add'et til en JFrames BorderLayoutManager i CENTER-placeringen.

Tegningen virker fint nok, men hvis jeg åbner et eller andet program,
der så skjuler min tegning, bliver den ikke re-rendereret, når det
overliggende vindue lukkes eller flyttes. Altså, ingen automatisk repaint.

Hvordan klarer jeg dette problem?

Pft Janus

--
Kids, try this at home: http://www.legendsrpg.net/index.php?refid=799

 
 
Thomas Bendsen (26-07-2005)
Kommentar
Fra : Thomas Bendsen


Dato : 26-07-05 18:04

Janus wrote:
> Hej NG!
> Har lige siddet og lavet en lille tegning vha Graphics2D'et fra et
> JPanel. På dette JPanel har jeg sat setPrederredSize(800,600) og er
> add'et til en JFrames BorderLayoutManager i CENTER-placeringen.
>
> Tegningen virker fint nok, men hvis jeg åbner et eller andet program,
> der så skjuler min tegning, bliver den ikke re-rendereret, når det
> overliggende vindue lukkes eller flyttes. Altså, ingen automatisk repaint.
>
> Hvordan klarer jeg dette problem?
>
> Pft Janus
>
Hej Janus

Så vidt jeg husker burde det altså fungere uden at du skal bekymre dig
om det. Hvilken metode benytter du til at tegne i? I Swing er det eneste
korrekte at overskrive metoden
"protected void paintComponent(Graphics g)".

Hvis du f.eks. har overskrevet metoden "paint(graphics g)" som man vist
nok skulle gøre i AWT så kan det måske give din fejl.

Hvis det ikke løser dit problem så prøv at skrive igen, evt. med noget kode.

Med venlig hilsen
Thomas Bendsen

Janus (26-07-2005)
Kommentar
Fra : Janus


Dato : 26-07-05 19:13

Thomas Bendsen wrote:
> Janus wrote:
>
>> Hej NG!
>> Har lige siddet og lavet en lille tegning vha Graphics2D'et fra et
>> JPanel. På dette JPanel har jeg sat setPrederredSize(800,600) og er
>> add'et til en JFrames BorderLayoutManager i CENTER-placeringen.
>>
>> Tegningen virker fint nok, men hvis jeg åbner et eller andet program,
>> der så skjuler min tegning, bliver den ikke re-rendereret, når det
>> overliggende vindue lukkes eller flyttes. Altså, ingen automatisk
>> repaint.
>>
>> Hvordan klarer jeg dette problem?
>>
>> Pft Janus
>>
> Hej Janus
>
> Så vidt jeg husker burde det altså fungere uden at du skal bekymre dig
> om det. Hvilken metode benytter du til at tegne i? I Swing er det eneste
> korrekte at overskrive metoden
> "protected void paintComponent(Graphics g)".
>
> Hvis du f.eks. har overskrevet metoden "paint(graphics g)" som man vist
> nok skulle gøre i AWT så kan det måske give din fejl.
>
> Hvis det ikke løser dit problem så prøv at skrive igen, evt. med noget
> kode.
>
> Med venlig hilsen
> Thomas Bendsen

Tja, noget i stil med:

JFrame frame = new JFrame(new BorderLayout());
JPanel panel = new JPanel();
panel.setPreferredSize(800,600);
frame.getContentPane().add(panel);

Graphics2D g2d = (Graphics2D)panel.getGraphics();

g2d.drawLine(0, 0, 300, 300);


-det går ganske fint... indtil føromtalte situation opstår, hvilket jo
sker ret tit.

Vh Janus

--
Kids, try this at home: http://www.legendsrpg.net/index.php?refid=799

Janus (26-07-2005)
Kommentar
Fra : Janus


Dato : 26-07-05 19:42

Janus wrote:
> Thomas Bendsen wrote:
>
>> Janus wrote:
>>
>>> Hej NG!
>>> Har lige siddet og lavet en lille tegning vha Graphics2D'et fra et
>>> JPanel. På dette JPanel har jeg sat setPrederredSize(800,600) og er
>>> add'et til en JFrames BorderLayoutManager i CENTER-placeringen.
>>>
>>> Tegningen virker fint nok, men hvis jeg åbner et eller andet program,
>>> der så skjuler min tegning, bliver den ikke re-rendereret, når det
>>> overliggende vindue lukkes eller flyttes. Altså, ingen automatisk
>>> repaint.
>>>
>>> Hvordan klarer jeg dette problem?
>>>
>>> Pft Janus
>>>
>> Hej Janus
>>
>> Så vidt jeg husker burde det altså fungere uden at du skal bekymre dig
>> om det. Hvilken metode benytter du til at tegne i? I Swing er det
>> eneste korrekte at overskrive metoden
>> "protected void paintComponent(Graphics g)".
>>
>> Hvis du f.eks. har overskrevet metoden "paint(graphics g)" som man
>> vist nok skulle gøre i AWT så kan det måske give din fejl.
>>
>> Hvis det ikke løser dit problem så prøv at skrive igen, evt. med noget
>> kode.
>>
>> Med venlig hilsen
>> Thomas Bendsen
>
>
> Tja, noget i stil med:
>
> JFrame frame = new JFrame(new BorderLayout());
> JPanel panel = new JPanel();
> panel.setPreferredSize(800,600);
> frame.getContentPane().add(panel);
>
> Graphics2D g2d = (Graphics2D)panel.getGraphics();
>
> g2d.drawLine(0, 0, 300, 300);
>
>
> -det går ganske fint... indtil føromtalte situation opstår, hvilket jo
> sker ret tit.
>
> Vh Janus
>

Men pænt snedigt at extende JPanel og så ellers køre smøren af i
paintComponent ... i hvert virker det efter hensigten nu, tak.

Well, en rask søgning på key words "drawing jpanel" på Google gav også
svaret på første hit.. anyways, tak tak! :)

Vh Janus


--
Kids, try this at home: http://www.legendsrpg.net/index.php?refid=799

Thomas Bendsen (26-07-2005)
Kommentar
Fra : Thomas Bendsen


Dato : 26-07-05 20:04

Janus wrote:
>
> Men pænt snedigt at extende JPanel og så ellers køre smøren af i
> paintComponent ... i hvert virker det efter hensigten nu, tak.
>
> Well, en rask søgning på key words "drawing jpanel" på Google gav også
> svaret på første hit.. anyways, tak tak! :)
>
> Vh Janus
>
>

Hej Janus

Vi må have siddet og skrevet på samme tid Nå, men det er egentlig
ikke fordi det er specielt snedigt. Som sagt er det (i følge den Sun
tutorial jeg linkede til) den eneste rigtige måde at gøre det på.

Med venlig hilsen
Thomas

Thomas Bendsen (26-07-2005)
Kommentar
Fra : Thomas Bendsen


Dato : 26-07-05 20:00

Janus wrote:

> Tja, noget i stil med:
>
> JFrame frame = new JFrame(new BorderLayout());
> JPanel panel = new JPanel();
> panel.setPreferredSize(800,600);
> frame.getContentPane().add(panel);
>
> Graphics2D g2d = (Graphics2D)panel.getGraphics();
>
> g2d.drawLine(0, 0, 300, 300);
>
>
> -det går ganske fint... indtil føromtalte situation opstår, hvilket jo
> sker ret tit.
>
> Vh Janus
>
Hej Janus

Dette vil netop resultere i det problem du beskriver. Du tegner linien
en enkelt gang, men næste panelet bliver bedt om at tegne sig (ved at
dets paintComponent-metode kaldes), ved det jo ikke at der skal tegnes
en linie.
Du er nødt til at definere en ny klasse som overskriver paintComponent
metoden.
I stil med:
public class MyClass extends JPanel {
   protected void paintComponent(Graphics g) {
    if (isOpaque()) { //paint background
    g.setColor(getBackground());
    g.fillRect(0, 0, getWidth(), getHeight());
   }
      

      Graphics2D g2d = (Graphics2D)g.create();
      //Brug nu g2d til at lave din tegning
   g2d.dispose(); //clean up
   }

}

Nu kan du lave en ny instans af MyClass og addere til din JFrame.
I øvrigt vil det måske være en god idé at læse
http://java.sun.com/docs/books/tutorial/uiswing/14painting/index.html
(hvor jeg også mere eller mindre har taget ovenstående fra)

Med venlig hilsen
Thomas

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409074
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste