paintComponent /paint/ update/ offscreenImage / Graphics2D /

Status
Nicht offen für weitere Antworten.

podi

Mitglied
Tag Freunde,
wer Lust bzw kurz Zeit hat und mir gern helfen möchte, der möge mal bitte den folgenden revolutionären Code ausführen und mir bei folgenden Fragen helfen:


1) wie ändere ich den Hintergrund des off Images ? (alle Versuche haben nix gebracht, auch unter der Verwendung eines BufferedImage und (Graphics2D.setBackground)


2) wenn ich in der Methode mouseDragged paint/paintComponent bzw update aufrufe funktioniert das Zeichenprogramm so wie es sein sollte. Wenn ich dagegen repaint() aufrufe, kommt es zu Aussetzern beim Zeichnen.


Kann mir da jemand den Zusammenhang bzw die Ursache erklären???
ganz schön verwirrend das alles...


danke



Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 
 * @author Synthie
 * 
 *
 */
public class Übung11_Lösung2 extends JFrame 
{
	
	private JPanel buttonPanel;

	private JButton colorChooserButton, clearButton;

	private Color newColor;	

	public Übung11_Lösung2() 
	{
		super("Scribbler");		
		buttonPanel = new JPanel();
		buttonPanel.setBackground(Color.WHITE);
		colorChooserButton = new JButton("Show Color Chooser");
		
		colorChooserButton.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				newColor = JColorChooser.showDialog(Übung11_Lösung2.this,
						"Choose Color", null);						
			}
		});		
		
		
		buttonPanel.add(colorChooserButton);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,500);
		// setResizable(false);
		setLocationRelativeTo(null);

		getContentPane().add(new DrawingPanel(), BorderLayout.CENTER);
		getContentPane().add(buttonPanel, BorderLayout.SOUTH);

	}

	class DrawingPanel extends JPanel
	{	
		Image off = null;			
		int oldX, oldY,newX,newY;
		
		public DrawingPanel() 		
		{				
			
			addMouseListener(new MouseAdapter()
			{
				public void mousePressed(MouseEvent e) 
				{
					
					oldX = e.getX();
					oldY = e.getY();					
				}
			});

			addMouseMotionListener(new MouseMotionAdapter() 
			{
				public void mouseDragged(MouseEvent e)
				{					
					newX = e.getX();
					newY = e.getY();
					
					paint(getGraphics());
					
					/*funzt auch
					paintComponent(getGraphics());
					update(getGraphics());
					*/			
					
					//hmm?
					//repaint();
					oldX = newX;
					oldY = newY;
							
				}				
			});					
			
		}
	
	     public void paintComponent ( Graphics gfx ) 
	     {	    	
	    	 if (off == null) 
	         {	            
	            off = createImage(getWidth(),getHeight());	            
	         }	        
	    	 
	    	 Graphics g = off.getGraphics();
	    	 //off.setzeHintergrundfarbe(ich will weiß!!!)
	    	 g.setColor(newColor);
	    	 g.drawLine(oldX,oldY,newX,newY);	    	 
	    	 
	         gfx.drawImage(off,0,0,this);	         
	     }	     
	   
	}// class DrawingPanel

		


	public static void main(String[] args)
	{
		new Übung11_Lösung2().setVisible(true);
	}

}
 
B

Beni

Gast
1) Ein Bild ist eine Gitter von Pixeln. "Vordergrund" und "Hintergrund" haben in diesem Zusammenhang keine Bedeutung, sowas gibt es nicht bei einem Bild.
Du könntest es mal mit ein bisschen Transparenz versuchen, ein BufferedImage mit ARGB-Model sollte sowas können. Dann musst du den Hintergrund zuerst zeichnen, und dann das Bild darüber legen.

2) repaint wäre schon das Richtige. Machst du sonst noch irgendwelche zeitintensiven Berechnungen?
 

podi

Mitglied
Nee das Programm macht nix weiter ;)


es geht nur darum, dass eben nicth mehr richtig gezeichnet wird wenn ich an der stelle repaint() benutze. Man probiere es doch einfach mal aus.
paintComponent() zB liefert ein richtiges Zeichnen, so wie es sein soll.
repaint() dagegen zeichnet keine flüssigen linien sondern einfach nur punkte :-/
 
B

Beni

Gast
Synthesist hat gesagt.:
Man probiere es doch einfach mal aus.
Wo du recht hast, hast du recht.

Hier mit repaint:
Code:
public class Übung11_Lösung2 extends JFrame
{
   
   private JPanel buttonPanel;

   private JButton colorChooserButton, clearButton;

   private Color newColor;   

   public Übung11_Lösung2()
   {
      super("Scribbler");      
      buttonPanel = new JPanel();
      buttonPanel.setBackground(Color.WHITE);
      colorChooserButton = new JButton("Show Color Chooser");
      
      colorChooserButton.addActionListener(new ActionListener()
      {
         public void actionPerformed(ActionEvent e)
         {
            newColor = JColorChooser.showDialog(Übung11_Lösung2.this,
                  "Choose Color", null);                  
         }
      });      
      
      
      buttonPanel.add(colorChooserButton);
      
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(500,500);
      // setResizable(false);
      setLocationRelativeTo(null);

      getContentPane().add(new DrawingPanel(), BorderLayout.CENTER);
      getContentPane().add(buttonPanel, BorderLayout.SOUTH);

   }

   class DrawingPanel extends JPanel
   {   
      Image off = null;         
      int oldX, oldY,newX,newY;
      
      public DrawingPanel()       
      {            
         
         addMouseListener(new MouseAdapter()
         {
            public void mousePressed(MouseEvent e)
            {
               
               oldX = e.getX();
               oldY = e.getY();               
            }
         });

         addMouseMotionListener(new MouseMotionAdapter()
         {
            public void mouseDragged(MouseEvent e)
            {               
               newX = e.getX();
               newY = e.getY();
               
               //paint(getGraphics());
               
               /*funzt auch
               paintComponent(getGraphics());
               update(getGraphics());
               */         
           
               if (off == null)
               {              
                  off = createImage(getWidth(),getHeight());              
               }          
             
               Graphics g = off.getGraphics();
               g.setColor(newColor);
               g.drawLine(oldX,oldY,newX,newY);          
             
               //hmm?
               repaint();
               oldX = newX;
               oldY = newY;
                     
            }            
         });               
         
      }
   
        public void paintComponent ( Graphics gfx )
        {          
             gfx.drawImage(off,0,0,this);            
        }        
      
   }// class DrawingPanel

      


   public static void main(String[] args)
   {
      new Übung11_Lösung2().setVisible(true);
   }

}
repaint arbeitet verzögert (das sparrt einiges an Ressourcen), aber damit wird auch dein Befehl was auf das Bild zu malen verzögert. Aber du kannst auch direkt auf das Bild malen, und es "ab und zu" mal anzeigen lassen.
 

podi

Mitglied
Ok so klappts.

Danke auch für die Antwort zu der Frage mit dem "Hintergrund". Geht nun auch.
Ich habe ein BufferedImage genommen

Code:
  off = new BufferedImage(getWidth(),getHeight(),BufferedImage.TRANSLUCENT);


..die Hintergrundfarbe des Panels normal im Konstruktuor wie gewünscht gesetzt und das BufferImage drübergelegt.

C'est ca.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
M Unterschied zwischen paintComponent() und paint()? AWT, Swing, JavaFX & SWT 4
T Klassenobjekte in paintComponent()/ paint() leer AWT, Swing, JavaFX & SWT 3
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
G update, paintComponent AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
K Swing paintComponent, JPanel auslagern, ChangeEvents AWT, Swing, JavaFX & SWT 7
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
M DefaultTableModel ruft paintComponent auf ! AWT, Swing, JavaFX & SWT 4
T Swing paintComponent(); AWT, Swing, JavaFX & SWT 24
K Swing JButton paintComponent überschreiben AWT, Swing, JavaFX & SWT 5
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
P Swing problem mit paintComponent AWT, Swing, JavaFX & SWT 2
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
K paintComponent nicht aufgerufen AWT, Swing, JavaFX & SWT 2
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
W JPanel Überschreiben // paintComponent? AWT, Swing, JavaFX & SWT 4
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
P JLabel paintComponent AWT, Swing, JavaFX & SWT 3
Z Swing paintcomponent und menbar Problem AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent & BorderFactory AWT, Swing, JavaFX & SWT 2
A paintComponent AWT, Swing, JavaFX & SWT 4
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
K JPanel und paintComponent AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
J paintComponent() übergeben AWT, Swing, JavaFX & SWT 4
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
E WARUM wird paintComponent nicht aufgerufen? AWT, Swing, JavaFX & SWT 12
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
G Swing paintComponent Effizienz? AWT, Swing, JavaFX & SWT 4
R paintComponent Kollision AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent() AWT, Swing, JavaFX & SWT 2
T Swing paintComponent problem AWT, Swing, JavaFX & SWT 3
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
A paintComponent überdeckt ... AWT, Swing, JavaFX & SWT 13
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
F Wer ruft paintComponent() Methode auf? AWT, Swing, JavaFX & SWT 9
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
G paintComponent Problem AWT, Swing, JavaFX & SWT 6
T paintComponent() überschreiben: Platz für Border freihalten? AWT, Swing, JavaFX & SWT 6
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
X Speichern in der paintComponent() Methode AWT, Swing, JavaFX & SWT 15
W JLabel + paintComponent AWT, Swing, JavaFX & SWT 2
V Wieviel Logik in paintComponent? AWT, Swing, JavaFX & SWT 7
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
G paintComponent() Methode für JPanel in NetBeans überschreibe AWT, Swing, JavaFX & SWT 2
L Problem mit paintComponent() under java < 1.6 under Windo AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
N Probleme mit paintComponent und GradientPaint AWT, Swing, JavaFX & SWT 5
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
G paintComponent wird nicht dargestellt AWT, Swing, JavaFX & SWT 5
T Kuchendiagramm - mit paintComponent nach JButton druck zeich AWT, Swing, JavaFX & SWT 4
R paintComponent wird anscheinend nicht aufgerufen AWT, Swing, JavaFX & SWT 2
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
M super.paintComponent(g); aufrufen oder nicht? AWT, Swing, JavaFX & SWT 8
D JTextArea in der paintComponent () hinzufügen? AWT, Swing, JavaFX & SWT 9
raptorrs J2D paintComponent: Nur ganzzahlige (-int) Werte möglich? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben