paintComponent

KingOfExceptions

Bekanntes Mitglied
hey leute :) ich hab mal wieder ein problem ;(

ich habe ein JFrame für das menu und dann noch einen button um einen neuen JFrame zu öffnen:

Java:
if(obj==startbutton) //WENN DER BUTTON GEDRÜCKT WIRD
	  {
		  getRootPane().setBackground(Color.BLUE);
		  new GaMeFeNsTeR(800,600);   //NEUER JFRAME 		  
		  repaint();
	  }

dann möchte ich dass in diesem neuen JFrame ein zähler läuft, der jede sekunde um eins erhöht wird.
dazu hab ich das hier gemacht:

Java:
public void paintComponent(Graphics g) {
		super.paintComponent(g);		
		g.setColor(Color.red);
		
		System.out.println("TEST");
		
		while(zaehler<=3)  //ERSTMAL NUR 3 SEK ZUM TESTEN
		{
			g.drawString("Zeit: " + Long.toString(zaehler), 20, 10);
			++zaehler;
			
			try 
 			{
 				Thread.sleep(999);
 			} 
 			catch (Exception ex) 
 			{
 				System.out.println("FEHLER!!!");
 			}
			
		}
		
		
		
	
		}

jedoch macht das ganze nicht so was es soll. nämlich wird erst das neue fenster geöffnet (was ja so sein soll) und dann bleibt das fenster durchsichtig bis die drei sekunden abgelaufen sind, dann wird es blau. ich möchte aber dass das fenster ZUERST blau wird und dann "Zeit:" ausgegeben wird. denn jetzt wird nichts ausgegeben.

Kann mir da jemand helfen?
 

njans

Top Contributor
Java:
getRootPane().setBackground(Color.BLUE);
getRootPane().repaint();
new GaMeFeNsTeR(800,600);
Dir ist hoffentlich klar, dass du mit deinem 1 Sekunden warten, die ganze Gui lahm legst, da das auf dem ED-Thread läuft :)
Java bietet auch Timer an: Java.util.Timer oder Java.swing.Timer
 

0x7F800000

Top Contributor
1) Was soll obj==startbutton sein? Normalerweise möchte man einen Button mit dazugehörigen Listenern sehen...

2) GaMeFeNsTeR? Es soll CamelCase sein, nicht CaMeLcAsE :autsch: . Der Sinn ist, dass es leichter zu lesen ist, und nicht dass der Leser an ZNS-Versagen stirbt.

3) Afair gibt es bei swing eine Timer-Klasse, die genau dazu da ist, solche periodischen Ereignisse alle paar Sekunden auszulösen.

4) in der paint-methode wird NUR gemalt. Da wird nicht mit irgendwelchen Threads rumgewartet. Es muss von der Struktur her genau verdreht herum sein: es muss einen Timer geben, der dauernd Ereignisse auslöst, es muss ein JComponent mit actionListener geben, der darauf hört, und bei jedem ereignis alles neuzeichnet. Das neuzeichnen muss möglichst schnell erfolgen, und sicherlich nicht sekundenlang blockieren.
 

bERt0r

Top Contributor
new GaMeFeNsTeR(800,600); //NEUER JFRAME
Nein, Nein, Nein hör auf mit Leetspeak oder wie das heisst, du erweckst dadurch einen kindischen Eindruck. Camelcase heisst jedes neue Wort gross schreiben: machWasTollesMeineSchoeneFunktion()
Du bist mit deinem PaintComponent komplett auf dem Holzweg. Schau dir die Basics der GUI Programmierung an. Strings kannst du mit JLabels darstellen, als anfänger solltest du von paint/paintComponent erst mal die Finger lassen.
Um so einen Zähler wie du ihn möchtest zu erstellen musst du erstmal wissen was ein Thread ist. Das heisst minimum 2 Kapitel eines guten Javabuchs durchlesen/-arbeiten:
Galileo Computing :: Java ist auch eine Insel – 14 Threads und nebenläufige Programmierung
Galileo Computing :: Java ist auch eine Insel – 19 Grafische Oberflächen mit Swing
 

njans

Top Contributor
4) in der paint-methode wird NUR gemalt. Da wird nicht mit irgendwelchen Threads rumgewartet. Es muss von der Struktur her genau verdreht herum sein: es muss einen Timer geben, der dauernd Ereignisse auslöst, es muss ein JComponent mit actionListener geben, der darauf hört, und bei jedem ereignis alles neuzeichnet. Das neuzeichnen muss möglichst schnell erfolgen, und sicherlich nicht sekundenlang blockieren.

Das solltest du dir zu Herzen nehmen.
Wenn du einen richtigen Timer willst, dann muss dieser in einem anderen Thread laufen, sonst ist dein Programm lahm gelegt.
 

bERt0r

Top Contributor
Bei labels kann man mit setText("") bequem, schnell und einfach zur Laufzeit den Angezeigten Text verändern.
 

njans

Top Contributor
@Anfänger97
Das JLabel wird dir wohl deswegen als Darstellungsmöglichkeit vorgeschlagen, da du ja die paintComponent() Methode überschrieben hast und davon ausgegangen wird, dass du diese zur Darstellung der Zeit nehmen wolltest :)
 

KingOfExceptions

Bekanntes Mitglied
ok ich hab mir jetzt mal die tipps zu herzen genommen und mir ein paar tuts zu threads durchgelesen... dabei stoße ich aber schon gleich auf mein erstes problem:
Java:
Runnable run;
	Thread th=new Thread(this);
	th.start();

Java:
public void run()
	{ System.out.println("TEST");}

komischerweise(?) kommt bei mir von eclipse das hier:

Syntax error on token "start", Identifier expected after this token

was ist denn an
Java:
th.start();
falsch? ich meine ich hätte das immer so gesehen.... ?? :autsch:
 

Ark

Top Contributor
Zeig mal deine gerade geposteten Codehäppchen als Ganzes so, wie sie auch im Code stehen.

Das [c]Runnable run;[/c] sieht aber schon mal so seltsam aus.

Ark
 

KingOfExceptions

Bekanntes Mitglied
Java:
class Spielfenster extends JPanel implements Runnable{

	private static final long	serialVersionUID	= 1L;
	JFrame frame;
	long fps 		  = 0; 
  
	Runnable run;
	Thread th=new Thread(this);
	th.start();
	
	int zaehler=1;
	int zaehler1=1;

	
	
	public void run()
	{
		while(zaehler<=5)
		{
			
			++zaehler;
			
			try
			{
				Thread.sleep(999);
			}
			catch (Exception ex) 
			{
				System.out.println("FEHLER!!!");
			}
			
			System.out.println("ALLES OK.");
			
		}
	}
}

das programm sollte jede sekunde alles ok schreiben ,und
Code:
Runnable run ;
hat eclipse mir gesagt ;)
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Was hat dir "Eclipse gesagt"? Die [c]run[/c] Variable ist nirgends benutzt, und auch nicht initialisiert, wozu ist sie da? Was soll mit dem ganzen passieren? Gibt's eine main i-wo?
 

Ark

Top Contributor
Ich habe keine Ahnung, was du mit dem Code vorhast, aber du musst mindestens (sehr wahrscheinlich mehr) das mit dem [c]th.start()[/c] in einen Methodenrumpf (z.B. main-Methode?!) packen.

Ark
 

Michael...

Top Contributor
Java:
class Spielfenster extends JPanel implements Runnable{

	private static final long	serialVersionUID	= 1L;
	JFrame frame;
	long fps 		  = 0; 
  
	Runnable run;
	Thread th=new Thread(this);
	th.start();
...
Das ist kein gültiger Code. Du befindest Dich hier im Deklarationsteil einer Klasse, hier können keine Methoden aufgerufen werden. (s. Lehrbuch "Aufbau einer Klasse")
 

KingOfExceptions

Bekanntes Mitglied
Java:
class Spielfenster extends JPanel implements Runnable{

	private static final long	serialVersionUID	= 1L;
	JFrame frame;
	long fps 		  = 0; 
  
        public static void main(String[] args){
		Runnable run;
	Thread th=new Thread(this);
	th.start();
	
	int zaehler=1;
	int zaehler1=1;
	}
	

	
	
	public void run()
	{
		while(zaehler<=5)
		{
			
			++zaehler;
			
			try
			{
				Thread.sleep(999);
			}
			catch (Exception ex) 
			{
				System.out.println("FEHLER!!!");
			}
			
			System.out.println("ALLES OK.");
			
		}
	}
	
	
	
	public Spielfenster(int w, int h){
		this.setPreferredSize(new Dimension(w,h));
		this.setBackground(Color.BLUE);
		frame = new JFrame("GameDemo");
		frame.setLocation(100,100);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);		
		g.setColor(Color.red);
		
		g.drawString("Zeit: " + Long.toString(zaehler), 20, 10);		
		
		repaint();
		
		}
	
	
	
	
}

das hier ist die ganze klasse. eigentlich wollte ich "nur" einen neuen thread machen.... ;( damit ich dann da irgendwann mal die "uhr" reinmachen kann (siehe anfang des themas)
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Also, hier ist erstmal der abgetrennte Zähler, der nur bisschen was in die Konsole ausgibt:
Java:
class Spielfenster implements Runnable{
  
    Thread th = new Thread(this);
    {
    	th.start();
    }
    int zaehler=1;
    
    public void run()
    {
        while(zaehler<=5)
        {
            
        	System.out.println("zähler = " + zaehler);
            zaehler ++;
            
            try
            {
                Thread.sleep(999);
            }
            catch (Exception ex) 
            {
                System.out.println("FEHLER!!!");
            }
        }
    }
    
    public static void main(String[] args){
    	new Spielfenster();
    }
}
Das andere dings gug ich mir gleich an...
 

0x7F800000

Top Contributor
Ne, gug ich mir doch nicht an... Aber vielleicht hilft dir das hier (erstmal copy-paste, laufen lassen)
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Date;

public class BasicAnimation{

	// eine Basisklasse für rechteckige Panels, die irgendwas animiertes anzeigen
	@SuppressWarnings("serial")
	public abstract static class AnimationPanel extends JComponent implements ActionListener{
		
		// constructor wo man die Zeit zwischen den Bildern übergeben kann
		public AnimationPanel(final int pauseTime){  
			// neuen timer erstellen, sich selbst als beobachter anmelden und starten
			new Timer(pauseTime, this).start(); 
		}
		// etwas kürzer
		public AnimationPanel(){ this(0);}
		
		// das hier hört auf die Timer-ereignisse, und malt jedes mal alles neu
		@Override public void actionPerformed(ActionEvent e){ 
			move();
			repaint(); 
		}
		
		// das muss jedes mal anders überschrieben werden: hier verändert man den Zustand der Animation, falls nötig
		public abstract void move();
	}
	
	// main, wo ein fenster aufgemacht wird, in dem ein paar animationen ablaufen
	@SuppressWarnings("serial")
	public static void main(String[] args){
		JFrame frame = new JFrame("Animationen");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(new Dimension(800,400));
		frame.getContentPane().setLayout(new GridLayout(1, 2));
		
		// erste animation: digitale uhr
		frame.getContentPane().add(new AnimationPanel(200){
			@Override
			public void paint(Graphics g){
				g.setColor(Color.BLACK);
				g.fillRect(0, 0, getWidth(), getHeight());
				g.setColor(Color.GREEN);
				g.drawString(new Date().toString() + "[" + System.currentTimeMillis() + "]", 10, 30);
			}
			@Override
			public void move(){} // nix zu tun, zeit läuft auch so
		});
		
		// zweite animation (mit internem Zustand): ein rumhüpfender ball
		frame.getContentPane().add(new AnimationPanel(50){
			
			private int r = 10;
			private double[] pos = {150, 150};
			private double[] vel = {-30, 30};
			private double dt = 0.2;
			
			@Override
			public void move(){
				pos[0] += dt * vel[0];
				pos[1] += dt * vel[1];
				vel[1] += dt * 10;
				if (pos[0] - r < 0){ pos[0] = r; vel[0] *= -0.9; }
				if (pos[0] + r > getWidth()){ pos[0] = getWidth() - r; vel[0] *= -0.9; }
				if (pos[1] - r < 0){ pos[1] = r; vel[1] *= -0.2; }
				if (pos[1] + r > getHeight()){ pos[1] = getHeight() - r; vel[1] *= -1.05; }
			}
			
			@Override
			public void paint(Graphics g){
				g.setColor(Color.YELLOW);
				g.fillRect(0, 0, getWidth(), getHeight());
				g.setColor(Color.RED);
				g.fillOval((int)(pos[0] - r),(int)(pos[1] - r), 2*r, 2*r);
			}
		});
		
		// starten
		frame.setVisible(true);
	}
}
 

KingOfExceptions

Bekanntes Mitglied
ok hab jetzt einfach
Code:
g.drawString(new Date().toString(), 10, 10);
in mein richtiges programm kopiert. gibt es ne möglichkeit dass der einem nur die zeit anzeigt oder muss da das datum und so stehenbleiben?
 

0x7F800000

Top Contributor
Bei Java muss man nicht mal nach einer Antwort suchen, um mit ziemlicher Sicherheit "Ja" sagen zu können. Wie das geht... hm... schau dir mal SimpleDateFormat (Java 2 Platform SE v1.4.2) an, das ist so ein dings, mit dem man die Uhrzeit so formattieren kann, wie man will. Inwiefern das noch aktuell ist: kA, kenn mich da ehrlich gesagt nicht aus, wozu will man auch die Uhreit wissen?^^ ;)
 

0x7F800000

Top Contributor
eigentlich wollte ich nur eine uhr haben, die von 00 anfängt und dann immer weiter hochzählt...
Eine Uhr zeigt die Uhrzeit an. Wenn du keine Uhr willst: dann mach keine Uhr. Wenn du einen einfachen Zähler willst: dann mach einen einfachen Zähler. Ich kann dir nicht sagen, was du wollen sollst, du hast nach einer "Uhr" gefragt, also habe ich da irgendwas Uhrzeitmäßiges hingeschrieben, weiter nichts.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Probleme mit paintComponent Java Basics - Anfänger-Themen 13
F Java GUI-PaintComponent funktioniert nicht Java Basics - Anfänger-Themen 1
H Programmaufbau in Ordnung? Problem mit paintComponent() Java Basics - Anfänger-Themen 10
I Methoden public void paintComponent (Graphics g) Java Basics - Anfänger-Themen 4
S Rectangles ausserhalb der paintComponent drawen! Java Basics - Anfänger-Themen 9
M Problem mit paintComponent Java Basics - Anfänger-Themen 6
M PaintComponent Java Basics - Anfänger-Themen 9
J Wer oder was ruft die "paintComponent()" Methode auf? Java Basics - Anfänger-Themen 19
K paintComponent Java Basics - Anfänger-Themen 9
G paintComponent wird nicht ausgeführt Java Basics - Anfänger-Themen 4
kulturfenster paintComponent wird nicht aufgerufen Java Basics - Anfänger-Themen 16
kulturfenster Frage bez paintComponent Java Basics - Anfänger-Themen 5
kulturfenster super.paintComponent(g); Java Basics - Anfänger-Themen 3
G fehler bei paintComponent Java Basics - Anfänger-Themen 6
kulturfenster paintComponent und Timer Java Basics - Anfänger-Themen 2
W Weitere Parameter in die paintComponent()-Methode übergeben? Java Basics - Anfänger-Themen 7
ElViZ paintComponent in den Vordergrund? Java Basics - Anfänger-Themen 2
F paintComponent mit repaint() aufrufen Java Basics - Anfänger-Themen 27
M paintComponent() in abstrakter und vererbender Klasse Java Basics - Anfänger-Themen 3
G paintComponent(Graphics g) Java Basics - Anfänger-Themen 2
V KSKB zum Verständnis von Graphics und paintComponent Java Basics - Anfänger-Themen 6
G paintComponent neu zeichnen Java Basics - Anfänger-Themen 5
S paintComponent, neue Instanz überschreibt wohl alte Instanz Java Basics - Anfänger-Themen 6
G Exception in PaintComponent Java Basics - Anfänger-Themen 2
U BufferedImage anzeigen, imageIcon oder paintComponent(); Java Basics - Anfänger-Themen 6
G probleme mit paintComponent Java Basics - Anfänger-Themen 14
M Probleme mit JPanel und paintComponent Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben