ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
1341
1341
EMPFEHLEN
-
17.05.07 11:27 #1
- Registriert seit
- Apr 2007
- Beiträge
- 8
Hallo allerseits,
Ich habe ein 2 Fragen bezüglich repaint():
1. Gibt es eine allgemeine Regel, wann repaint() aufgerufen werden muss? Ich bin nämlich jedes Mal wieder überrascht, wenn es wieder soweit ist...
2. Ich habe Probleme mit einer Main-Methode, die mir 2 bewegende Rechtecke aus 2 Klassen darstellen soll. Mein Problem ist, dass sie immer nur das letzte Objekt anzeigt.
Hier die main-Methode:
Es zeigt mir also nur r3 an. Wie kann ich das richten?Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public static void main(String[] args) { Rectangle2 r2 = new Rectangle2(); Rectangle3 r3 = new Rectangle3(); JFrame frame = new JFrame(); frame.setSize(breite, laenge); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(r2); frame.add(r3); frame.setVisible(true); }
Vielen Dank für Tipps!
-
Immer dann, wenn du etwas verändert hast und diese Änderung sehen möchtest.1. Gibt es eine allgemeine Regel, wann repaint() aufgerufen werden muss? Ich bin nämlich jedes Mal wieder überrascht, wenn es wieder soweit ist...
Dafür brauch man schon was mehr Code als nur die main.. zeig mal die Rectangel2/3 Klassen bzw. die Methoden in denen du zeichnest2. Ich habe Probleme mit einer Main-Methode, die mir 2 bewegende Rechtecke aus 2 Klassen darstellen soll. Mein Problem ist, dass sie immer nur das letzte Objekt anzeigt.
-
17.05.07 15:16 #3
- Registriert seit
- Apr 2007
- Beiträge
- 8
danke erst mal für die Antwort!
ok, hier die beiden Klassen:
und noch hier:Code :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
package timerKap11; import javax.swing.Timer; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.Rectangle; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JComponent; public class Rectangle3 extends JComponent{ private Rectangle r = new Rectangle(5,10,50,50); public Rectangle3() { class Mover implements ActionListener { public void actionPerformed(ActionEvent event) { r.translate(2, 2); repaint(); } } ActionListener listener = new Mover(); final int DELAY = 1000; Timer t = new Timer(DELAY, listener); t.start(); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.draw(r); } }
Code :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
package timerKap11; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JComponent; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Rectangle2 extends JComponent{ private Rectangle r = new Rectangle(5,10,20,30); public Rectangle2() { class Mover implements ActionListener { public void actionPerformed(ActionEvent event) { r.translate(1,1); repaint(); } } ActionListener listener = new Mover(); final int DELAY = 100; javax.swing.Timer t = new javax.swing.Timer(DELAY, listener); t.start(); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.draw(r); } }
-
du fügst r2 ein und dann wird es gezeichnet (weil in sienem Konstruktor die repaint() Methode aufgerufen wird) Danach fügst du r3 hinzu und dann wird seine repaint() Methode aufgerufen und da dort das r2 nicht gezeichnet wird, wird es auch nciht mehr angezeigt
-
17.05.07 18:08 #5MeinerEiner_80 Tutorials.de Gastzugang
Moin!
Das Problem liegt darin, das du
1) deinen JFrame direkt neue Komponenten hinzufügst.
Du solltest dir merken, man fügt einem JFrame nicht direkt etwas hinzu, sondern dessem ContentPane.
2) Wird nichts angezeigt, weil sich deinen Komponenten überlagern. Ordne sie korrekt an, beispielsweise mit einem Layout, und es funktioniert auch:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public static void main(String[] args) { Rectangle2 r2 = new Rectangle2(); Rectangle3 r3 = new Rectangle3(); JFrame frame = new JFrame(); frame.setSize(breite, laenge); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new GridLayout(2,1)); frame.getContentPane().add(r2); frame.getContentPane().add(r3); frame.setVisible(true); }
Es sei denn du möchtest wirklich beide Rechtecke in einem Container zeichen.
Dann musst wirklich der Container, in dem die Rechtecke angezeigt werden sollen, auch beide Rechtecke zeichen.
Zum Beispiel:
Painter.java
}Code :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
/* * Painter.java * * Created on 17. Mai 2007, 18:18 * * */ package tutorials; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JPanel; /** * * @author JW */ public class Painter extends JPanel{ Rectangle rec2 = null; Rectangle rec3 = null; /** Creates a new instance of Painter */ public Painter() { } public void setRectangle2(Rectangle rec){ rec2 = rec; repaint(); } public void setRectangle3(Rectangle rec){ rec3 = rec; repaint(); } public void paintComponent(Graphics g){ super.paintComponent(g); if(rec2!= null){ ((Graphics2D)(g)).draw(rec2); } if(rec3!= null){ ((Graphics2D)(g)).draw(rec3); } } public static void main(String[] args) { Painter p = new Painter(); Rectangle2 r2 = new Rectangle2(p); Rectangle3 r3 = new Rectangle3(p); JFrame frame = new JFrame(); frame.setSize(breite, laenge); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(p); frame.setVisible(true); }
Rectangle 2 bzw. Rectangle3
Auch wenn es für dieses Beispiel meiner Meinung nach nicht viel Sinn macht, 2 Klassen extra für die Rechtecke und deren Steuerung zu erstellen.. Aber das kann ein Programmierer ja machen wie er willCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public class Rectangle2 extends JComponent{ private Rectangle r = new Rectangle(5,10,50,50); public Rectangle2(final Painter paint) { class Mover implements ActionListener { public void actionPerformed(ActionEvent event) { r.translate(2,2); paint.setRectangle2(r); } } ActionListener listener = new Mover(); final int DELAY = 100; javax.swing.Timer t = new javax.swing.Timer(DELAY, listener); t.start(); }
*grüssle*
MeinerEinerGeändert von MeinerEiner_80 (17.05.07 um 18:31 Uhr)
Ähnliche Themen
-
Canvas Repaint
Von sandisk im Forum JavaAntworten: 0Letzter Beitrag: 15.05.10, 18:13 -
Problem mit repaint()
Von Mazzok im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 25.05.09, 20:34 -
Repaint problem
Von socke999 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 3Letzter Beitrag: 25.05.09, 11:30 -
C4D Repaint Probleme
Von Dicrivity im Forum Cinema 4DAntworten: 1Letzter Beitrag: 18.03.09, 18:36 -
repaint() Problem
Von h@dez im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 4Letzter Beitrag: 22.09.03, 13:28





Zitieren
Login





