systemausgelöstes Uebermalen von Linien

bandy

Bekanntes Mitglied
Hallo,

ich moechte ein systemausgelöstes Uebermalen von Linien erzeugen und mit einem Timer es steuern, einige Tutorials und Infos zu diesem Thema habe ich gelesen, jedoch gelingt mir die Umsetzung nicht. Ich moechte einfach eine Linie zeichnen, dann diese loeschen und nach gewisser Zeit dies an einer anderen Stelle zeichnen lassen. Ich haette gerne den completen Quelltext und dann wenn Fragen auftauchen diese dann evt. hier stellen. So finde ich kann man es am Besten lernen. Ein deutlicher funktionierender Beispiel ersetzt alle uberfluessige und uberschreitende Tutorials, die zwar das gleiche Thema vielleicht ansprechen aber oft zu viele unnoetige fuer diese Aufgabe Themen in Betracht ziehen und Quelltext oft uber hunderte oder gar tausende Zeilen geht. Bis da man beim ersten Mal den Sinn versteht und es so umbaut wie man's bracht, kann einiges vergehen.Hier mein Quelltext:

Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Grafik extends JPanel{

	
	private static final long serialVersionUID = 1L;

	@Override
	protected void paintComponent(Graphics g) {
		
		super.paintComponent(g);
		
		
				g.setColor(Color.red);
				g.drawLine(10, 10, 100, 10);
				repaint();
				
		       //Hier dazwischen soll Verzoegerung des Timers
				
				g.setColor(Color.green);
				g.drawLine(10, 50, 100, 50);
				repaint();	
	}		
}

Java:
import javax.swing.JFrame;




public class Rahmen extends JFrame{

	private static final long serialVersionUID = 1L;
	
	public Rahmen(String t) {
		super(t);
		
		
		
		add(new Grafik());
		setSize(340, 340);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	
}

Kann mir jemand so helfen wie ich es gern haette?:bahnhof:
 

XHelp

Top Contributor
Mach doch ein boolean rein
Code:
paintLine
. Wenn es wahr ist, zeichnest du die Linie, wenn nicht, dann nicht.
 

Quaxli

Top Contributor
Der repaint()-Aufruf hat in paintComponent nix verloren. Der muß von außen erfolgen.
Hier mal ein Beispiel wo alles auf die Schnelle in eine Klasse gequetscht wurde.


Java:
import javax.swing.*;
import java.awt.*;

public class Example extends JPanel implements Runnable{

	private static final long	serialVersionUID	= 1L;
	JFrame frame;
	boolean red = true;

	public static void main(String[] args){
		new Example();
	}
	
	public Example(){
		setPreferredSize(new Dimension(100,100));
		frame = new JFrame("Beispiel");
		frame.add(this);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
		
		Thread th = new Thread(this);
		th.start();
	}
	
	@Override
	protected void paintComponent(Graphics g) {

		super.paintComponent(g);
		
    if(red){
  		g.setColor(Color.red);
  		g.drawLine(10, 10, 100, 10);
    }else{
  		g.setColor(Color.green);
  		g.drawLine(10, 50, 100, 50);
    }

	}

	public void run() {
	
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		red = false;
		repaint();
		
		
	}

}
 

bandy

Bekanntes Mitglied
Der repaint()-Aufruf hat in paintComponent nix verloren. Der muß von außen erfolgen.
Hier mal ein Beispiel wo alles auf die Schnelle in eine Klasse gequetscht wurde.


Java:
import javax.swing.*;
import java.awt.*;

public class Example extends JPanel implements Runnable{

	private static final long	serialVersionUID	= 1L;
	JFrame frame;
	boolean red = true;

	public static void main(String[] args){
		new Example();
	}
	
	public Example(){
		setPreferredSize(new Dimension(100,100));
		frame = new JFrame("Beispiel");
		frame.add(this);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
		
		Thread th = new Thread(this);
		th.start();
	}
	
	@Override
	protected void paintComponent(Graphics g) {

		super.paintComponent(g);
		
    if(red){
  		g.setColor(Color.red);
  		g.drawLine(10, 10, 100, 10);
    }else{
  		g.setColor(Color.green);
  		g.drawLine(10, 50, 100, 50);
    }

	}

	public void run() {
	
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		red = false;
		repaint();
		
		
	}

}
Quaxli ein Dankeschoen hast heute in jedem Fall verdient:toll:, aber ich wuerde gerne noch mehr verstehen, z.B. interessiert mich wie kann man diesen Vorgang so erweitern, dass man es in einer Schleife wiederholen kann so oft man es braucht? Wie Schleifen funktionieren weiss ich aber wie man es hier genau verwendet nicht, weil dass etwas speziel und neu fuer mich ist.
 

bandy

Bekanntes Mitglied
Musst die Schleife dann in die run Methode packen und in der Schleife das was jetzt da steht ausführen.
Zu den Schleifen: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 2.7 Schleifen

Das habe ich versucht, aber es loest nur den else-Zweig der Methode paintComponent() aus. Somit zeigt es nur die zweite, also die gruene Linie an. Ich haete aber beide Linien abwechselnd.


Java:
public void run() {
    	boolean a=true;
    	while(a){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        red = false;
        repaint();
    	 }  
    	}
 

XHelp

Top Contributor
Da steht red = false in der Schleife. Wie soll er denn was anderes machen? :bahnhof: Du musst dann eben immer abwechseln mit z.B.
Code:
red = !red
oder so...
 

Quaxli

Top Contributor
Außerdem ist das

Java:
while(a){

 ...

}

kein guter Ansatz, weil Du kein Abbruchkriterium für diesen 2. Thread hast.
Besser wäre z. B.:

Java:
while(frame.isVisible()){

 ...

}
 

Ähnliche Java Themen

Neue Themen


Oben