Moin,
ich habe ein kleines Problem mit Swing. Ich habe beobachtet, dass Swing-Anwendungen unter Windows ziemlich träge sind (unter Linux komischer Weise nicht).
Ich habe dazu ein Minimalbeispiel gebaut, was 30 Mal pro Sekunde ein JFrame neu zeichnen soll... in diesem JFrame befindet sich ein JPane, welches eine Horizontale Linie zeichnet (bei jedem Neuzeichnen an einer anderen Stelle),
Die erste komische Sache ist, diese Animation recht langsam ist und viel CPU frisst... aber nur, bis ich einen Resize-Event auslöse (indem ich das Fenster per Hand vergrößere/verkleinere)... ab da läuft es flüssiger.
Die zweite komische Sache ist, während der ersten Phase (vor dem manuell Resize-Event) scheint diese Anwendung sogar die GUIs anderer Windows Programme auszubremsen... selbst wenn ich die VM mit Idle Priorität laufen lasse, zeichnen sich alle anderen Windowsanwendungen (Seamonkey, Windows Desktop, XChat) auch nur träge neu, wenn ich den TaskManager quer über den Bildschirm verschiebe.
Wird das Java Fenster minimiert, ist die CPU Last gleich hoch, aber alle anderen Windowsanwendungen zeichnen sich wieder normal-schnell neu.
Wie gesagt ab dem ersten Resize des Java Fensters sind diese Probleme plötzlich weg. Kann sich das jemand erklären?
Für ungeduldige zum Testen die jar Datei:
http://rapidshare.com/files/115993422/SwingTest.jar.html
Für alle anderen ist hier der Quelltext von meinem Minimalbeispiel :
JAnimatedPane.java
SwingTest.java
ich habe ein kleines Problem mit Swing. Ich habe beobachtet, dass Swing-Anwendungen unter Windows ziemlich träge sind (unter Linux komischer Weise nicht).
Ich habe dazu ein Minimalbeispiel gebaut, was 30 Mal pro Sekunde ein JFrame neu zeichnen soll... in diesem JFrame befindet sich ein JPane, welches eine Horizontale Linie zeichnet (bei jedem Neuzeichnen an einer anderen Stelle),
Die erste komische Sache ist, diese Animation recht langsam ist und viel CPU frisst... aber nur, bis ich einen Resize-Event auslöse (indem ich das Fenster per Hand vergrößere/verkleinere)... ab da läuft es flüssiger.
Die zweite komische Sache ist, während der ersten Phase (vor dem manuell Resize-Event) scheint diese Anwendung sogar die GUIs anderer Windows Programme auszubremsen... selbst wenn ich die VM mit Idle Priorität laufen lasse, zeichnen sich alle anderen Windowsanwendungen (Seamonkey, Windows Desktop, XChat) auch nur träge neu, wenn ich den TaskManager quer über den Bildschirm verschiebe.
Wird das Java Fenster minimiert, ist die CPU Last gleich hoch, aber alle anderen Windowsanwendungen zeichnen sich wieder normal-schnell neu.
Wie gesagt ab dem ersten Resize des Java Fensters sind diese Probleme plötzlich weg. Kann sich das jemand erklären?
Für ungeduldige zum Testen die jar Datei:
http://rapidshare.com/files/115993422/SwingTest.jar.html
Für alle anderen ist hier der Quelltext von meinem Minimalbeispiel :
JAnimatedPane.java
Code:
import java.awt.Graphics;
import javax.swing.JPanel;
public class JAnimatedPane extends JPanel
{
long round = 0;
public JAnimatedPane()
{
}
public void paint(Graphics g)
{
super.paint(g);
g.drawLine(0, (int)(round%getHeight()), getWidth(), (int)(round%getHeight()));
round++;
}
}
SwingTest.java
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class SwingTest extends Thread
{
boolean stop = false;
JFrame frame;
public SwingTest()
{
frame = new JFrame();
frame.setSize(640, 480);
frame.setLayout(new BorderLayout());
frame.add(new JAnimatedPane());
frame.validate();
frame.setVisible(true);
frame.addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
stop = true;
frame.dispose();
}
}
);
start();
}
public void run()
{
while(!stop)
{
frame.repaint();
try { Thread.sleep(1000/30); } catch (InterruptedException e) { }
}
}
public static void main(String[] args)
{
new SwingTest();
}
}