repaint()-Problem - 50% CPU-Auslastung

hodoe

Mitglied
Hallo,

ich habe mal den Code angehängt. Ich möchte gerne in mehreren Reitern Text auch Grafik darstellen.
Dazu habe ich ein JPanel angelegt, in dem ich zeichne. Problem: Durch das repaint() habe ich eine CPU-Auslastung von 50%. Lasse ich das weg, dann wird das Pane nicht so dargestellt, wie ich es gerne hätte. Wie mache ich es richtig?

Gruß
Holger

Java:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LayoutManager;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;



public class Test extends javax.swing.JFrame  
{
	private static final long serialVersionUID = 1L;
	private 	ArrayList<JSensorPanel> sensorBlatt = new ArrayList<JSensorPanel>();//dies sind die einzelnen Reiter
	private 	JTabbedPane 			jTabbedPane1; 			//das ist der Container für die Reiter

	public Test() 
	{
		super("Test");
		initGUI();    	     
	}
		
	
	
	
	
	@SuppressWarnings("deprecation")
	private void initGUI() 
	{
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		getContentPane().setLayout(null);

    	jTabbedPane1 = new JTabbedPane();
		jTabbedPane1.setBounds(7, 85, 1085, 671);
		sensorBlatt.add(new JSensorPanel());	
		jTabbedPane1.addTab("Test", null, sensorBlatt.get(0), null);
	
		this.setSize(1109, 871);
		this.setResizable(false);
		this.setPreferredSize(new java.awt.Dimension(1109, 871));
		pack();
		
	}
	
	//****************************************************************************************
	//*** JSensorPanel ist eine Erweiterung der Klasse JPanel für die grafische Oberfläche ***
	//****************************************************************************************
	public class JSensorPanel extends JPanel
	{
	    
	    //Alle Konstruktoren von JPanel Übernehmen....
	    public JSensorPanel() 
	    {
	        this(true);
	    }

	    public JSensorPanel(LayoutManager layout) 
	    {
	        this(layout, true);
	    }

	    public JSensorPanel(boolean isDoubleBuffered) 
	    {
	        this(new FlowLayout(), isDoubleBuffered);
	    }

	    public JSensorPanel(LayoutManager layout, boolean isDoubleBuffered) 
	    {
	        super(layout, isDoubleBuffered);

			this.setLayout(null);
			this.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
		
				
			getContentPane().add(jTabbedPane1);
		}
	    
	    	    
	    public void paintComponent(Graphics g)
	    {
	    	super.paintComponent(g); 
	    	Graphics2D g2 = (Graphics2D) g;
	    	super.paintComponent(g2); 
	       	g2.setColor(Color.white);
	    	g2.fillRect(0,0,1077,639);
	    	g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
	    	g2.setColor(Color.lightGray);
	    	g2.draw(new Rectangle2D.Double(3, 264, 1072, 342));
		
    		//Hinweistext
    		g2.draw(new Rectangle2D.Double(3, 610, 1072, 27));

	    	AffineTransform af = new AffineTransform();
	    	af.rotate(Math.toRadians(270),30,530); //um 90 Grad drehen
	    	g2.setTransform(af); //Drehung auf das Kosy übertragen

	    	af.rotate(- Math.toRadians(270),30,530); //Kosy zurück drehe, da sonst alles um 90 Grad gedreht gezeichent wird
	    	g2.setTransform(af);
	     			
	    	g2.draw(new Line2D.Double(80, 275, 80, 595));
	    	g2.draw(new Line2D.Double(80, 275, 75, 285));
	    	g2.draw(new Line2D.Double(80, 275, 85, 285));
	    	g2.draw(new Line2D.Double(80, 595, 75, 585));
	    	g2.draw(new Line2D.Double(80, 595, 85, 585));

	    	g2.draw(new Line2D.Double(80, 435, 1050, 435));
	    	g2.draw(new Line2D.Double(1050, 435, 1040, 430));
	    	g2.draw(new Line2D.Double(1050, 435, 1040, 440));
	    	    	
	    	repaint();
	    	
	    }
	}
	

	 
	public static void main(String[] args) 
		{
			//Ab hier wird der Splashscreen aufgebaut. Wartezeit ca. 50 * 100ms
	    
					
			SwingUtilities.invokeLater(new Runnable() 
			{
				public void run() 
				{
					Test inst = new Test();
					inst.setLocationRelativeTo(null);
					inst.setVisible(true);
				}
			});
		}
}
 

Antoras

Top Contributor
Das Problem an deiner jetzigen Methode ist, dass ein repaint-Kommando unmittelbar auf ein anderes folgt. Die CPU wird also dazu verdonnert ohne Pause zu arbeiten. Dies musst du umgehen, indem du den repaint-Aufruf in einen zweiten Thread auslagerst, der außerdem noch ein sleep-Aufruf beinhaltet, um der CPU zwischen dem Neuzeichnen die Möglichkeit zu geben noch was anderes zu machen.

Du hast nicht genauer geschrieben warum du ein repaint benötigst. Wenn du keine Inhalte hast die sich ständig ändern, dann sollte es reichen repaint z.B. mit Hilfe eines Listeners aufzurufen. Dann erfolgt der repaint-Aufruf eben nur, wenn z.B. gescrollt wird, grafisch dargestellte Inhalte geändert werden usw. Das ständige Neuzeichnen durch einen zweiten Thread wäre dann Ressourcenverschwendung.
 

hodoe

Mitglied
Hallo, danke für die Antwort. Ein Aufruf mit
Java:
	    	try
			{
				Thread.sleep(50); //50
			}
			catch(InterruptedException e)
			{		
				catchAusgabeInterruptedException(e);
			}
			
	    	repaint();

bringt Entspannung. Das Auslagern in einen ChangeListener habe ich probiert. Es ging aber nicht. Mein Programm liest Daten ein und stellt diese im oberen Teil des Fensters dar. Unten erscheint dann noch ein Diagramm. Dann ändert sich nichts mehr. Das Problem ist, wenn kein repaint() aufgrufen wird, dass dann die Grafik nicht im unteren Teil sauber aufgebaut wird.

Gruß
Holger
 

Antoras

Top Contributor
Dann lade als erstes die Daten und stelle dann das vollständige GUI dar. Für solche Fälle gibt es schon fertige Klassen mit denen du das Laden visualisieren kannst, wie z.B. JProgressBar, ProgressMonitor oder ProgressMonitorInputStream.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
T repaint() Problem AWT, Swing, JavaFX & SWT 2
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
J [gelöst] repaint problem AWT, Swing, JavaFX & SWT 2
M problem mit repaint()-Methode[gelöst] AWT, Swing, JavaFX & SWT 8
G problem mit threads/repaint ! AWT, Swing, JavaFX & SWT 2
D Problem mit Netbeans und repaint() AWT, Swing, JavaFX & SWT 5
E Problem mit repaint() AWT, Swing, JavaFX & SWT 11
K Problem mit JLabel, Rechteck, repaint() ;) AWT, Swing, JavaFX & SWT 2
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
M Problem bei Repaint von Panels AWT, Swing, JavaFX & SWT 2
L Swing repaint problem AWT, Swing, JavaFX & SWT 7
B Problem bei repaint AWT, Swing, JavaFX & SWT 5
V repaint problem AWT, Swing, JavaFX & SWT 12
A Repaint-Problem AWT, Swing, JavaFX & SWT 4
S repaint()-Problem AWT, Swing, JavaFX & SWT 6
S Repaint()-Problem im GBL? AWT, Swing, JavaFX & SWT 5
S paint/repaint problem mit awt/swing? AWT, Swing, JavaFX & SWT 2
L repaint()-Problem AWT, Swing, JavaFX & SWT 18
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben