Hallo,
ich habe ein eigentlich simples Problem, hänge nun aber schon recht lange dran.
Ich habe 3 Klassen, Main (erbt von JFrame), GraphicPanel (erbt von JPanel mit paintComponent Methode) und ein Thread. Die beiden letzteren werden in Main erzeugt. Nun läuft mein Thread fleißig umher und soll irgendwann im GraphicPanel ein repaint aufrufen. Nur wie ?
Das ganze sieht kurzgefasst etwa so aus, dass man etwas malt und sobald man die Maus eine halbe Sekunde loslässt, soll alles verschwinden.
ich habe ein eigentlich simples Problem, hänge nun aber schon recht lange dran.
Ich habe 3 Klassen, Main (erbt von JFrame), GraphicPanel (erbt von JPanel mit paintComponent Methode) und ein Thread. Die beiden letzteren werden in Main erzeugt. Nun läuft mein Thread fleißig umher und soll irgendwann im GraphicPanel ein repaint aufrufen. Nur wie ?
Das ganze sieht kurzgefasst etwa so aus, dass man etwas malt und sobald man die Maus eine halbe Sekunde loslässt, soll alles verschwinden.
Java:
public class Main extends JFrame implements MouseMotionListener{
private JTextArea text = new JTextArea(5,5);
private ArrayList<Punkte> punkte = new ArrayList<Punkte>();
private Punkte hp = new Punkte();
private GraphicPanel pad = new GraphicPanel(punkte);
private Warten warten = new Warten(); // der Thread
public Main(){
....
public void mouseMoved(MouseEvent e){
warten.setAktiv(true);
warten.setZeit(System.currentTimeMillis() + 500);
hp.setPunkte(e.getXOnScreen(), e.getYOnScreen());
punkte.add(hp);
hp = new Punkte();
repaint();
}
--------------------------------------------------
public class GraphicPanel extends JPanel{
private Image offscreen;
private Graphics2D g2d;
private Punkte hp;
private ArrayList<Punkte> punkte;
public GraphicPanel(ArrayList<Punkte> punkte){
this.punkte = punkte;
}
@Override public void paintComponent(Graphics g){
super.paintComponent(g);
offscreen = createImage(this.getWidth(),this.getHeight());
g2d = (Graphics2D) offscreen.getGraphics();
g2d.setColor(Color.red);
g2d.fillRect(0,0,400,300);
g2d.setColor(Color.BLACK);
for(int i = 0; i < punkte.size(); i++){
hp = (Punkte) punkte.get(i);
Point p = this.getLocationOnScreen();
g2d.fillOval((int) (hp.x() - 3 - p.getX()),(int) (hp.y() - 3 - p.getY()), 6, 6);
}
g.drawImage(offscreen,0,0,this);
}
}
--------------------------------------------------
public class Warten extends Thread{
private long zeit;
private boolean aktiv = false;
public Warten(){
}
public void run(){
zeit = System.currentTimeMillis() + 500;
while(true){
if(aktiv){
try{
Thread.sleep(50);
}catch(Exception e){}
if(System.currentTimeMillis() > zeit){
aktiv = false;
// Hier soll jetzt irgendwie das repaint aufgerufen werden, aber alle Versuche sind gescheitert
}
}
}
}
Zuletzt bearbeitet von einem Moderator: