repaint updateArea

Status
Nicht offen für weitere Antworten.
H

hallo

Gast
Hallo allerseits.

Bin schon seit einer weile an einem Problem dran, komme aber irgendwie nicht vorwärts.
Es geht darum, dass es ein Objekt gibt, welches einer Maus (MouseMotionListener) folgt.
Dies soll effizient geschehen, also nicht alles repainten. Nun da liegt das Problem.
Habe den Code mal auf das Essentielle getrimmt.


Die zeichnende Klasse:

Code:
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Test {
	
	private JFrame frame;
	private JPanel panel;
	
	/** das zu zeichnende */
	private SomeDrawing drawing;
	
	private Point mouseLocation = new Point(0,0);
	
	public Test(){
		init();
	}
	
	private void init(){
		frame = new JFrame();
		panel = new JPanel(){
			@Override
			public void paintComponent(Graphics g){
				drawing.paintComponent(g);
			}
		};
		panel.addMouseMotionListener(new MouseMotionAdapter(){
			public void mouseMoved(MouseEvent arg0) {
				mouseLocation = arg0.getPoint();
			}
		});
		frame.getContentPane().add(panel);
		frame.setSize(50,500);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	public void start(){
		drawing = new SomeDrawing(new Rectangle(10,50,5,50),this);
		// Thread der das gezeichnete updated
		Thread thread = new Thread(){
			public void run(){
				while(true){
					drawing.update(mouseLocation);
					try {
						Thread.sleep(25);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		};
		thread.start();
	}
	
	public void repaint(Rectangle rect){
		//geht
//		panel.repaint(rect);
//		frame.repaint();
		
		//komisch
//		panel.repaint(rect);
//		frame.repaint(rect.x, rect.y, rect.width, rect.width);
		
		//möchte ich eigentlich o0der mindesten das obere
		panel.repaint(rect);
	}
	
	
	public static void main(String[] args){
		Test test = new Test();
		test.start();
	}

}

Das zu zeichnende Objekt:
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;


public class SomeDrawing {

	private Test test;
	private Rectangle bounds;

	public SomeDrawing(Rectangle bounds,  Test test) {
		this.test = test;
		this.bounds = bounds;
	}
	
	// zeichne das Quadrat
	public void draw(Graphics g) {
		g.setColor(Color.BLACK);
		g.drawRect(bounds.x, bounds.y, bounds.width, bounds.height);
	}

	// repainten des Area
	public void redraw(Rectangle r) {
		test.repaint(new Rectangle(r.x, r.y, r.height+1, r.width+1));
	}

	public void paintComponent(Graphics g) {
		draw(g);
	}
	
	public void update(Point mouseLocation){
		Point oldLocation = bounds.getLocation();
		Point newLocation = new Point(oldLocation.x, mouseLocation.y - (bounds.width)/2);

		if (!oldLocation.equals(newLocation)) {
			moveTo(newLocation);
		}
	}
	
	/**
	 * berechnet update area: alte Location UNION neu L
	 * 
	 */
	public void moveTo(Point p){
		Rectangle newLocation = new Rectangle(bounds);
		move(p);
		newLocation = newLocation.union(bounds);
		redraw(newLocation);
	}
	
	/**
	 * setzt neues Ort
	 */
	public void move(Point p){
		bounds.setLocation(p);
	}

}

Vielleicht sieht von euch jemand was ich da falsch mache.
Danke schon mals
 

André Uhres

Top Contributor
Hallo hallo,
Ich hatte keine Lust, mich in dein Programm hineinzulesen.
Deshalb hier einfach nur ein Besipiel, wie es gehen könnte.
Gruß,
André

Code:
package demo; 
/* 
* SwingPaintDemo2.java 
*/ 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class SwingPaintDemo2 { 

    private static void createAndShowGUI() { 
        JFrame f = new JFrame(); 
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        MyPanel panel = new MyPanel(); 
        Square square = new Square(new Rectangle(10, 50, 5, 50)); 
        panel.setSquare(square); 
        f.add(panel); 
        f.pack(); 
        f.setVisible(true); 
    } 

    public static void main(final String[] args) { 
        SwingUtilities.invokeLater(new Runnable() { 

            public void run() { 
                createAndShowGUI(); 
            } 
        }); 
    } 
} 

class MyPanel extends JPanel { 

    private Square square; 

    public MyPanel() { 
        addMouseMotionListener(new MouseAdapter() { 

            @Override 
            public void mouseMoved(final MouseEvent e) { 
                square.moveSquare(e.getY()); 
            } 
        }); 
    } 

    public void setSquare(final Square square) { 
        square.setSquareContainer(this);
        this.square = square; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
        return new Dimension(50, 500); 
    } 

    @Override 
    public void paintComponent(final Graphics g) { 
        super.paintComponent(g); 
        square.draw(g); 
    } 
} 

class Square { 

    private Rectangle bounds; 
    private JComponent squareContainer;

    public Square(final Rectangle bounds) { 
        this.bounds = bounds; 
    } 

    public void draw(final Graphics g) { 
        g.drawRect(bounds.x, bounds.y, bounds.width, bounds.height); 
    } 

    public void moveSquare(final int y) { 
        final int OFFSET = 1; 
        if (bounds.y != y) { 
            squareContainer.repaint(bounds.x, bounds.y, bounds.width + OFFSET, bounds.height + OFFSET); 
            bounds.y = y; 
            squareContainer.repaint(bounds.x, bounds.y, bounds.width + OFFSET, bounds.height + OFFSET); 
        } 
    }

    public void setSquareContainer(final JComponent squareContainer) {
        this.squareContainer = squareContainer;
    }
    
}
 
G

Guest

Gast
Danke André

hab mal rasgefunden an ws es liegt.

JComponent.repaint(Rectangele) --> nix gut
Component.repaint(x,y,w,h) --> bene

Doch stellt sich mir noch eine Frage.
Worin liegt der Unterschied dieser beiden Methoden?
Vielleicht weiss es grad jemand auf die schnelle?
Danke jedenfalls schonmal.
 

André Uhres

Top Contributor
Anonymous hat gesagt.:
JComponent.repaint(Rectangele) --> nix gut
Component.repaint(x,y,w,h) --> bene
..Worin liegt der Unterschied dieser beiden Methoden?
Es gibt keinen wesentlichen Unterschied. Beide funktionieren gut bei mir :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
G Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben