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:
Das zu zeichnende Objekt:
Vielleicht sieht von euch jemand was ich da falsch mache.
Danke schon mals
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