paintComponent?

hallo,

ich hab ein Problem das zwar so ähnlich dutzende male geposted wurde aber verstehen tu ichs trotzdem nich.

Code:
package Fluxflow;

import java.awt.Graphics;
import javax.swing.JPanel;

public class meinActionPanel extends JPanel 
{
    
    private ParkettMalen pm;
    
    meinActionPanel()
    {
        pm=new ParkettMalen();
    }
    
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        System.out.println("*********************Inside paintComponent*******************");
        pm.vierEqParkettMalen(g);
    }
    
    public void setData(byte [][] parkett)
    {
        System.out.println("Start of actionpanel:setData");
          pm.setData(parkett);
          this.repaint();
          try 
        {
            Thread.sleep(250);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        
        System.out.println("End of actionpanel:setData");
    }
}

Code:
package Fluxflow;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Actionframe extends JFrame 
{
	JButton btnStart = new JButton("Start");
	JButton btnStop = new JButton("Stop");
	JPanel pnlNorden = new JPanel();
	
	meinDataPanel pnlData = new meinDataPanel();	
	meinActionPanel pnlAction = new meinActionPanel();
	
	boolean stop=false;
	
	public Actionframe()
	{
		super("Cirqulierende Farben");
		this.setSize(1000,750);
		initComponents();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);		
	}
	
	protected void initComponents()
	{
		//this.setLayout();
		pnlNorden.setBorder(BorderFactory.createLineBorder(Color.blue, 4));
		pnlData.setBorder(BorderFactory.createLineBorder(Color.BLACK, 4));
		pnlAction.setBorder(BorderFactory.createLineBorder(Color.red, 3));
		
		this.add(pnlNorden,BorderLayout.NORTH);
		this.add(pnlData,BorderLayout.EAST);
		this.add(pnlAction,BorderLayout.CENTER);
		
		btnStart.setBackground(Color.green);
		btnStop.setBackground(Color.red);
		btnStart.addActionListener(new MeinInnererStartListener());
		btnStart.addActionListener(new MeinInnererStopListener());
		pnlNorden.add(btnStart);
		pnlNorden.add(btnStop);
		
	}
	
	private class MeinInnererStartListener implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent event) 
		{
			CFGData cfgData;
			cfgData = pnlData.getCFGData();
			BerechneParkett bp = new BerechneParkett(cfgData);
			byte[][]parkett = bp.getParkett();
			pnlAction.setData(parkett);
			
			for(int x=0; x<10; x++)				
			{
				bp.initParkett();
				parkett = bp.getParkett();
				pnlAction.setData(parkett);
			}
			
		}
	}	
		
	private class MeinInnererStopListener implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent event) 
		{
				stop=true;		
		}
	}
}

Code:
package Fluxflow;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;

public class ParkettMalen
{
    private XEckMalen xEMalen;
    private int breite=0,hoehe=0;
    private int grPolygon=16;
    private byte [][] parkett;
    private Farben f=new Farben();


 
    public ParkettMalen() 
    {
        xEMalen=new XEckMalen(grPolygon, 4);//Vorläufig immer quadrate;
	}

	public void setData(byte [][] parkett)
    {
      this.parkett=parkett;
      breite=parkett.length;
      hoehe=parkett[0].length;
    }
	
    public void vierEqParkettMalen(Graphics g)
    {
    	
        for(int x=0;x<breite;x++)
        {
            for(int y=0;y<hoehe;y++)
            {

                int xZentrum = (int)Math.round((double)(x*grPolygon)+15);
                int yZentrum = (int)Math.round((double)(y*grPolygon)+15);
                Point pos=new Point(xZentrum,yZentrum);
                Color c=f.cField[parkett[x][y]];
              /*System.out.println("Feld x:"+x+" y:"+y+" Number:"+parkett[x][y]);
                System.out.println(pos);
              */  
                xEMalen.regelMaessigesXEckMalen(g, c, pos, Math.PI/4);
            }
        }
    }
}
So! das ist der code. warum wird paintComponent nur zu beginn und am Ende eines Start aufrufes auf gerufen? das parkett wird genau einmal gezeichnet soll aber öfters gezeichnet werden.
 
Ich würde hier eher Graphics.update(Graphics) nehmen als Graphics.repaint() .

Ach und als Anmerkung : [code][/code] macht sich für Java nicht so super ... verwende lieber [code=java][/code] ... da hast du dann auch gleich Syntax-Highlightning drin wodurch sich der Source ETWAS besser lesen lässt.
 
update(Graphics) macht sich gut... ersteigt nun in paintComponent ein zeichnet aber nicht?
ich hab übrigens oben bei: meinActionPanel this.repaint() aufgerufen...
hier mein verändertes meinActionPanel(). Zeichnen tut er immer noch nicht.
Java:
package Fluxflow;

import java.awt.Graphics;
import javax.swing.JPanel;

public class meinActionPanel extends JPanel 
{
	
	private ParkettMalen pm;
	private Graphics iG;
	
	meinActionPanel()
	{
		pm=new ParkettMalen();
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		
		System.out.println("*********************Inside paintComponent*******************");
		iG=g;
		pm.vierEqParkettMalen(g);
	}
	
	public void setData(byte [][] parkett)
	{
		System.out.println("Start of actionpanel:setData");
  		pm.setData(parkett);
  		this.update(iG);
  		try 
		{
			Thread.sleep(150);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		
		System.out.println("End of actionpanel:setData");
	}
}
 
1) Es hätte gereicht wenn du im ersten Post den EDIT-Button genutzt hättest
2) Das Problem warum nichts gezeichnet wird ist das du Graphics.update() das iG-Graphics-Objekt übergibst ... auf das aber nichts gezeichnet wurde ... darum ist es völlig richtig das NICHTS gezeichnet wird ... weil im Graphics auch NICHTS drin ist
Du übergibst an pm.vierEqParkettMalen nur g ... updatest aber iG ... das das nicht funktioniert ist klar ...
In Java funktioniert das so nicht da bei der Anweisung iG=g; keine Referenz übergeben wird sondern eine Kopie des Graphics-Objektes. Du müsstest also wenn dann die original-Referenz übergeben damit überhaupt was ins richtige Graphics-Objekt gelangt.
 
Wie?
paintComponent in der setData methode auf rufen geht nicht.
also nehm ich repaint().
klappt aber auch nicht. bis auf das letzte 'Parkett' das wird gezeichnet.
 

Neue Beiträge

Zurück