Repaint unterdrücken bei DrawLine in JPanel

Status
Nicht offen für weitere Antworten.
A

Azrail

Gast
Hallo erstmal. Ich hab da wieder einmal ein kleines Problem. und Zwar :

ich hab ne Darstellung eines Kalenders, die Anzahl der Wochen kann vom Benutzer gewählt werden. Für Jeden Tag stelle ich in diesem Kalender die Verfügbarkeit von Maschinen da, in Form einer Farbscala. D.h. je Viertelstunde des Tages einen 1pxl hohen Strich in einer bestimmten Farbe. Realisiert hab ich das mit nem JPanel auf das ich dann mit graphics Linien male, also 96 Striche ja Kalendertag. soweit so gut. sieht klasse aus und der Chef ist glücklich. bis ich anfange das JInternalframe zu verschieben. dann beginnt das ganze nähmlich die paintComponent und die Repaint - Methoden aufzurufen, und es flackert wie doof.
Also hab ich versucht mit setIgnoreRepaint das ganze in den Griff zu bekommen, ohne Erfolg. Der Versuch das ganze durch einsetzen einer boolschen Variable zum unterdrücken das Repaints hinzubiegen sorgte nur dafür das ich nun garnichts mehr angezeigt bekam. DoubleBuffering wollte ich dann auch noch einbauen, als ich in der API las das JPanel eh doubleBuffered ist.

Hat jemand noch ne gute idee?

Alternativ hab ich das ganze auch schon mit 96 JLabels je Tag realisiert, was auch funktioniert und nicht!!! flackert.
Leider sind das dann bei Anzeige von nur 4 Wochen schon 2688 Objekte, was das ganze irgendwie sau langsam macht :)

Für gute Ideen wär ich echt dankbar.
 

André Uhres

Top Contributor
Azrail hat gesagt.:
Repaint unterdrücken bei DrawLine in JPanel
Es ist eigentlich keine gute Idee das repaint unterdrücken zu wollen.
Wenn du den Frame verschiebst, dann muss ja alles neu gezeichnet werden !

Du könntest aber die Farblinien auf ein Image zeichnen und in paintComponent() mit drawImage()
nur das fertige Image malen. Damit müsste das Flackern behoben sein.
 
A

Azrail

Gast
Zuerst mal hallo, genau auf dich hab ich gehofft :)

Also ich hab mal versucht deinen Tip umzusetzen, aber ich hänge an dem drawImage().

Hier zuerst mal meine Klassen in Megavereinfacht (normalerweise wird die Klasse mit einem mit Farben gefüllten Vector aufgerufen (wie man im Konstruktor noch sieht), der dann in der Schleife durchlaufen wird):

Vorher:

Code:
public class ColorScale extends JPanel {
	
	public ColorScale(Vector s, int w){
		super(false);
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		
		for(int i=0;i<96;i++){
		    g.setColor(Color.GREEN);
		    g.drawLine(1,i,35,i);
		}
	}
	
	public void repaint(){
		super.repaint();
	}
	
	public void update(Graphics g){
		super.update(g);
	}
	
}


Nacher:

Code:
public class ColorScale extends JPanel {
	
	public ColorScale(Vector s, int w){
		super(false);
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		
		BufferedImage img = new BufferedImage(width, width, width);
		
		Graphics gp=img.getGraphics();
		
		for(int i=0;i<96;i++){
		    gp.setColor(Color.GREEN);
		    gp.drawLine(1,i,35,i);
		}

                                gp.drawImage(UND HIER HÄNGE ICH GRADE);
	}
	
	public void repaint(){
		super.repaint();
	}
	
	public void update(Graphics g){
		super.update(g);
	}
	
}


Ich hab nämlich keine Ahnung wo ich Image und ImageObserver herhole ...

Heut stell ich mich mal wieder echt dämlich an :-/
Code:
 

André Uhres

Top Contributor
Azrail hat gesagt.:
Ich hab nämlich keine Ahnung wo ich Image und ImageObserver herhole ...
Code:
/*
 * Farbscala2.java
 */
//package paint;
import java.awt.*;
import javax.swing.*;
public class Farbscala2 extends JFrame {
    public Farbscala2() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        cs = new ColorScale();
        getContentPane().add(cs);
        setVisible(true);
        cs.makeImage();
        cs.paintLine();
    }
    public static void main(String args[]) {new Farbscala2();}
    private ColorScale cs;
    public class ColorScale extends JPanel {
        public ColorScale(){
        }
        public void paintLine(){
            for(int i=0;i<96;i++){
                g2d.setColor(Color.GREEN);
                g2d.drawLine(1,i,35,i);
            }
            repaint();
        }
        public void makeImage(){
            image = createImage(getWidth(), getHeight());
            g2d = (Graphics2D)image.getGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.white);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.setColor(Color.black);
        }
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Rectangle r = g.getClipBounds();
            g.drawImage(image, r.x, r.y, r.width+r.x, r.height+r.y,
                    r.x, r.y, r.width+r.x, r.height+r.y, null);
        }
        private Image image;
        private Graphics2D g2d;
    }
}
 
A

Azrail

Gast
Genau das :)

GANZ LIEBEN DANK!
Weil an dem Problem hab ich mir gestern schon die ganze Schicht um die Ohren geschlagen.

Ok ich musste den Code für mich ein Wenig umschnipseln, da ich die ColorScale in meinem Code dynamisch aufrufe und die dann auch alle im selben InternalFrame gezeigt werden (Ist ja im eigentlichen Programm auch noch ein bisschen Datenbankzugriff und so drin :) )

Damit das paintComponent nicht ständig die makeImage()/paintLine() aufruft und somit ständig am rattern ist (man bedenke in meinem fall, in dem noch nicht viele Wochen bei nur 2 Maschinen angezeigt wird sind es bereits 28 Tage * 2 Maschinen = 56 paintComponent()), was meine Prozessorleistung auf ähh 100% hochreisst (habs ausprobiert *grinst*) setze ich image beim initialisieren der Klasse auf null, und kann das nachher ja prima abfragen


Code:
 public class ColorScale extends JPanel { 
        public ColorScale(Vector s, int w){  
            image=null; 
        } 
        public void paintLine(){ 
            for(int i=0;i<96;i++){ 
                g2d.setColor(Color.GREEN); 
                g2d.drawLine(1,i,35,i); 
            } 
            repaint(); 
        } 
        public void makeImage(){ 
        	image = createImage(getWidth(), getHeight()); 
            g2d = (Graphics2D)image.getGraphics(); 
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                    RenderingHints.VALUE_ANTIALIAS_ON); 
            g2d.setColor(Color.white); 
            g2d.fillRect(0, 0, getWidth(), getHeight()); 
            g2d.setColor(Color.black); 
        } 
        public void paintComponent(Graphics g) { 
            super.paintComponent(g); 
            if(image==null){
            	 this.makeImage(); 
            	this.paintLine(); 
        	}
            Rectangle r = g.getClipBounds(); 
            g.drawImage(image, r.x, r.y, r.width+r.x, r.height+r.y, 
                    r.x, r.y, r.width+r.x, r.height+r.y, null); 
        } 
        private Image image; 
        private Graphics2D g2d; 
    }

einwandfrei :))))

Außer du hast da noch Verbesserungsvorschläge... :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
A Problem: repaint() - Schleife 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
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
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
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
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
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
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
H repaint()-Problem - 50% CPU-Auslastung 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
T repaint() Problem AWT, Swing, JavaFX & SWT 2
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
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
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
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben