Applet JApplet Flackern durch Repaint

vR34kSH0w

Mitglied
hey,
ich habe folgendes applet geschrieben:

Java:
import java.awt.*;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;

public class ClockApplet extends JApplet
{
	int hours;
	int millis;
	int minutes;
	int seconds;
	
	Calendar calendar;
	Timer timer;
	
	public void init()
	{
		calendar = Calendar.getInstance();
		
		hours = calendar.get(Calendar.HOUR_OF_DAY);
		millis = calendar.get(Calendar.MILLISECOND);
		minutes = calendar.get(Calendar.MINUTE);
		seconds = calendar.get(Calendar.SECOND);
		
		timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask()
		{
			public void run()
			{
				millis++;
				
				if(millis == 1000)
				{
					millis = 0;
					seconds++;
				}
				
				if(seconds == 60)
				{
					seconds = 0;
					minutes++;
				}
				
				if(minutes == 60)
				{
					minutes = 0;
					hours++;
				}
				
				if(hours == 24)
				{
					hours = 0;
				}
				
				repaint();
			}
		}, 0, 1);
		
		setSize(200, 100);
		setBackground(Color.BLACK);
	}
	
	public void paint(Graphics g)
	{
		g.setColor(Color.BLACK);
		g.fillRect(0, 0, 200, 100);
		g.setColor(Color.WHITE);
		g.drawString(hours + " : " + minutes + " : " + seconds + " : " + millis, 20, 20);
	}
}

Durch das Neuzeichnen entsteht aber nun ein "Flackern", weil die aktuelle Zeit immer wieder überzeichnet werden muss. Gegoogelt habe ich schon, aber nichts gefunden 🙁

Weiß jemand eine Lösung oder soll ich besser Graphics2D verwenden?

Danke/Gruß
vR34k$H0w
 
Die Lösung ist nicht direkt auf das JApplet zu zeichnen, also nicht in der paint()-Methode des Applets, sondern ein JPanel zur ContentPane des JApplets zu machen und in dessen paintComponent() zeichnen (und darin
Code:
super.paintComponent(g);
nicht vergessen. Folglich auch alle Komponenten dem JPanel adden.
 
danke schonmal ich verstehe was du meinst, weiß aber ehrlich gesagt nicht so genau, wie ich das bewerkstellige (noch nich allzuviel mit applets gearbeitet). ein beispiel wäre hilfreich =)
 
Java:
import java.awt.*;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
 
public class ClockApplet extends JApplet
{
    int hours;
    int millis;
    int minutes;
    int seconds;
    
    Calendar calendar;
    Timer timer;
    
    public void init()
    {
        calendar = Calendar.getInstance();
        
        hours = calendar.get(Calendar.HOUR_OF_DAY);
        millis = calendar.get(Calendar.MILLISECOND);
        minutes = calendar.get(Calendar.MINUTE);
        seconds = calendar.get(Calendar.SECOND);
		
		// Hier ne Änderung:
		JPanel pnlDrawingArea = new JPanel() {
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				Graphics2D g2 = (Graphics2D) g.create();
				g2.setColor(Color.BLACK);
				g2.fillRect(0, 0, 200, 100);
				g2.setColor(Color.WHITE);
				g2.drawString(hours + " : " + minutes + " : " + seconds + " : " + millis, 20, 20);
				g2.dispose();
			}
		};
		setContentPane(pnlDrawingArea);
		// bis hier
        
        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask()
        {
            public void run()
            {
                millis++;
                
                if(millis == 1000)
                {
                    millis = 0;
                    seconds++;
                }
                
                if(seconds == 60)
                {
                    seconds = 0;
                    minutes++;
                }
                
                if(minutes == 60)
                {
                    minutes = 0;
                    hours++;
                }
                
                if(hours == 24)
                {
                    hours = 0;
                }
                
				// Hier ne Änderung:
                pnlDrawingArea.repaint();
            }
        }, 0, 1);
        
        setSize(200, 100);
		// Hier ne Änderung:
        pnlDrawingArea.setBackground(Color.BLACK);
    }
}
 
funktioniert bestens...ziemlich cool :toll:
frage zur semantik: macht es hier nun überhaupt noch sinn, ein applet zu verwenden oder ist es "besser", nur noch das panel zu verwenden?
 
Ohne Applet hast du kein ausführbares Programm. Es sei denn du machst eine Applikation daraus, d.h. du fügst eine main-Methode ein. Aber eine Applikation ist nun mal kein Applet. Also wenn du das Ding im Browser laufen haben willst, dann brauchst du auf jeden Fall das Applet.
 
Als wie bereits gesagt wurde brauchst du ein ausführbares Programm, was bei dir das JApplet ist. Aber ich empfehle dir die Hauptklasse der GUI von JPanel zu erben. Dann kannst du diese als ContentPane für allerlei Ausführbares benutzen, wie etwa wie bei dir JApplet oder JFrame oder JWindow.
 
Also nur damit das klar ist: Wenn das kein Applet werden soll, dann solltest du keinesfalls von JApplet erben. Entsprechend hast du dann auch diese ganzen Methoden á la init(), start() usw nicht. Statt dessen brauchst du eine main-Methode für die Applikation, in der das Programm dann startet:

Java:
public static void main(String... args){
   // Hier ist dein Programm
}
 
die anwendungen sollen nachher auf einen frame von daher habe ich jetzt auf das window verzichtet =) die klassen erben von jpanel und es funktioniert klasse :applaus:

danke :toll:
 

Zurück
Oben