Wie ändere ich in einem Panel eine Grafik?

  • Themenstarter Themenstarter Eklaf
  • Beginndatum Beginndatum
E

Eklaf

Hi alle ich muß im Rahmen eines Schulprojekts ein Programm schreiben und es läuft auch soweit habe nur noch ein kleines Problem.
Ich lasse in einem Panel eine Grafik zeichen dies wird durch das Betätigen eines Buttons ausgelöst das klappt das erste mal auch gut
nur wenn ich dann die werte ändere und die Grafik erneut zeichen will übermalt er die alte nur oder macht gar nichts kann mir bitte jemand helfen
wäre echt sehr dankbar.

Hier mal etwas Quellcode damit ihr ev seht wo das Problem ist:

public void actionPerformed(ActionEvent e)
{
if (e.getSource()== btnAmp)
{
double wertR=(double)sliderWertR.getValue()*1000;
double wertC=(double)sliderWertC.getValue()/1000000000;
double fg=gAmplitude.berechAmp(wertR,wertC);
lblFg.setText("Grenzfrequenz: "+Math.round(fg));
//pnlGrafik.add(gLeer); //Hier ligt mein problem hab auch schon pnlGrafik.removeAll(); versucht ging nicht
gAmplitude.repaint();
pnlGrafik.add(gAmplitude);
lblPicFormel.setIcon(new ImageIcon(getClass().getClassLoader().getResource("LautsprecherNeu/picFormelDB.gif")));
}
}

Wenn ich die zeile wie hier auskommentiere zeichnet er es zwar immer wieder aber das alte ist auch noch da gibt es eine möglichkeit das panel zu leeren bevor das neue gezeichnet wird
 
Hallo,

ich werde gerade aus deinem Code nicht ganz schlau.
Was ist gLeer, gAmplitude und lblPicFormel? Ist lblPicFormel das Icon was du meinst? Wo wird das hinzugefügt.

Gruß

Sascha
 
Leider ist dein Code nicht gut verständlich, da wir nicht wissen, zu welchen Klassen deine Variablen gehören...
Aber eventuell hilft dir folgende Methode der Klasse Graphics:
Java:
abstract  void clearRect(int x, int y, int width, int height) 
          Clears the specified rectangle by filling it with the background color of the current drawing surface.
 
Was ist gLeer, gAmplitude und lblPicFormel? Ist lblPicFormel das Icon was du meinst? Wo wird das hinzugefügt.

Also gLeer und gAmplitude sind unterklassen in denen ich die paint geschrieben habe.
lblPicFormel ist was anderes das läuft und macht kein Problem.

gAmplitude.repaint(); //hiermit zeichen ich die grafik mit den neuen Werten neu
pnlGrafik.add(gAmplitude); //hiermit füge ich die Grafik beim Panel Grafik ein

nur immer wieder neu ohne das alte vorher zu entfernen.

mit dem Code von HonniCilest kann ich leider nichts anfangen wüsste nicht wie ich den einbauen könnte.
 
Viel schlauer bin ich jetzt nicht. ;-)

Aber wenn ich es richtig verstanden habe, reicht es wenn du bei pnlGrafik deine alte Grafik entfernst und dann die gAmplitude hinzufügst.

Falls das so nicht funktioniert poste bitte mal den Code der Klasse von gAmplitude.

Gruß

Sascha
 
Genau, aber wie entferne ich das Unten der gewünschte Code.

Code:
package LautsprecherNeu;

import java.awt.*;
import javax.swing.*;

public class grafikAmplitude extends JPanel
{
	int x1,y1,pxlF,logZaehler;
	double erg,f,f2,dbErg1,dbErg2,fg;
	int [][]werteFeld=new int [2][820];
	
	public grafikAmplitude()
	{
		this.setPreferredSize(new Dimension(1000,600));			//Definierung der Fenstergröße
	}
	
	//Berechnung der Werte
	
	public double berechAmp(double wertR,double wertC)
	{
		fg=1/(2*Math.PI*wertR*wertC);
		for(pxlF=1;pxlF<160;pxlF++)								//Frequenzbereich 1-10
		{
			f=pxlF*0.0625;
			dbErg1=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f*wertC)*(2*Math.PI*f*wertC)+1))));
			f2=(pxlF+1)*0.0625;
			dbErg2=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f2*wertC)*(2*Math.PI*f2*wertC)+1))));
			werteFeld[0][pxlF]=(int)(dbErg1*(-11));
			werteFeld[1][pxlF]=(int)(dbErg2*(-11));
		}
		for(pxlF=160,logZaehler=0;pxlF<320;pxlF++)				//Frequenzbereich 10-100
		{
			f=(logZaehler*0.5625)+10;
			dbErg1=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f*wertC)*(2*Math.PI*f*wertC)+1))));
			f2=((logZaehler+1)*0.5625)+10;
			dbErg2=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f2*wertC)*(2*Math.PI*f2*wertC)+1))));
			werteFeld[0][pxlF]=(int)(dbErg1*(-11));
			werteFeld[1][pxlF]=(int)(dbErg2*(-11));
			logZaehler++;
		}
		for(pxlF=320,logZaehler=0;pxlF<480;pxlF++)				//Frequenzbereich 100-1000
		{
			f=(logZaehler*5.625)+100;
			dbErg1=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f*wertC)*(2*Math.PI*f*wertC)+1))));
			f2=((logZaehler+1)*5.625)+100;
			dbErg2=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f2*wertC)*(2*Math.PI*f2*wertC)+1))));
			werteFeld[0][pxlF]=(int)(dbErg1*(-11));
			werteFeld[1][pxlF]=(int)(dbErg2*(-11));
			logZaehler++;
		}
		for(pxlF=480,logZaehler=0;pxlF<640;pxlF++)				//Frequenzbereich 1000-10000
		{
			f=(logZaehler*56.25)+1000;
			dbErg1=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f*wertC)*(2*Math.PI*f*wertC)+1))));
			f2=((logZaehler+1)*56.25)+1000;
			dbErg2=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f2*wertC)*(2*Math.PI*f2*wertC)+1))));
			werteFeld[0][pxlF]=(int)(dbErg1*(-11));
			werteFeld[1][pxlF]=(int)(dbErg2*(-11));
			logZaehler++;
		}
		for(pxlF=640,logZaehler=0;pxlF<800;pxlF++)				//Frequenzbereich 10000-100000
		{
			f=(logZaehler*562.5)+10000;
			dbErg1=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f*wertC)*(2*Math.PI*f*wertC)+1))));
			f2=((logZaehler+1)*562.5)+10000;
			dbErg2=(20*Math.log(1/(Math.sqrt(wertR*wertR*(2*Math.PI*f2*wertC)*(2*Math.PI*f2*wertC)+1))));
			werteFeld[0][pxlF]=(int)(dbErg1*(-11));
			werteFeld[1][pxlF]=(int)(dbErg2*(-11));
			logZaehler++;
		}
		return fg;
	}
		
	public void paintComponent (Graphics g)
		{
			//super.paintComponent(g);
			//Erstellung des Koordinatensystems und Beschriftung
			g.drawLine(100, 100, 100, 550);						//Y Achse
			g.drawLine(100, 550, 900, 550);						//X Achse
			g.drawString("dB", 70, 100);						//Bezeichnung Y Achse
			g.drawString("f/kHz", 920, 550);					//Bezeichnung X Achse
			g.drawString("Amplituden-Frequenzgang", 400, 50);	//Überschrift
			g.setColor(Color.blue);
			int xtxt1=1;										//Startwert X Achse
			for(x1=0;x1<6;x1++)									//X Achsen Skalierung
			{
				g.drawLine(x1*160+100, 547, x1*160+100, 553);	//X Achsen Striche
				g.drawString(""+xtxt1, x1*160+93, 565);			//X Achsen Beschriftung
				xtxt1=xtxt1*10;
			}
			int ytxt=-40;
			for(y1=0;y1<5;y1++)									//Y Achsen Skalierung
			{
				g.drawLine(97, 550-y1*110, 103, 550-y1*110);	//Y Achsen Striche
				g.drawString(""+ytxt, 70, 555-y1*110);			//Y Achsen Beschriftung
				ytxt=ytxt+10;				
			}	
			//Einzeichnung der Werte
			g.setColor(Color.red);
			//g.drawLine(100+pxlF, 550-dbErg1, 100+(pxlF+1), 550-dbErg2);
			for(pxlF=0;pxlF<800;pxlF++)
			{
				g.drawLine(100+pxlF, 110+werteFeld[0][pxlF], 100+(pxlF+1), 110+werteFeld[1][pxlF]);
			}
		}
		
}
 
Ok.

Ist gAmplitude das Object was du schon mal hinzugefügt hast?
Falls ja brauchst du es normal nicht mehr neu hinzufügen.

Es würde dann generell reichen, wenn du
Code:
pnlGrafik.repaint();
aufrufst.
Dann brauchst du normal auch nicht mehr
Code:
gAmplitude.repaint();
aufrufen.

Gruß

Sascha
 
Ja das hab ich am Anfang auch gemacht allerdings kommen hierzu noch mehr Grafiken ich poste einfach mal das ganze programm :D

Code:
package LautsprecherNeu;

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.applet.*;


public class Lautsprecher extends javax.swing.JApplet implements ActionListener,ChangeListener
{
    private JSlider sliderWertR;
    private JPanel pnlGrafik;
    private JLabel lblWertR;
    private JPanel pnlBedienfeld;
    private JLabel lblUeberschrift;
    private JLabel lblBild;
    private grafikAmplitude gAmplitude = new grafikAmplitude();
    private grafikPhasengang gPhase = new grafikPhasengang();
    private JLabel lblFg;
    private JLabel lblPicFormel;
    private JLabel lblGrafisch;
    private JButton btnPhase;
    private JButton btnAmp;
    private JSlider sliderWertC;
    private JLabel lblWertC;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                Lautsprecher inst = new Lautsprecher();
                frame.getContentPane().add(inst);
                ((JComponent)frame.getContentPane()).setPreferredSize(inst.getSize());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
    public Lautsprecher() {
        super();
        initGUI();
    }
   
    private void initGUI() {
        try {
            getContentPane().setLayout(null);
            {
                pnlBedienfeld = new JPanel();
                getContentPane().add(pnlBedienfeld);
                pnlBedienfeld.setBounds(10, 10, 1000, 182);
                pnlBedienfeld.setLayout(null);
                {
                    lblBild = new JLabel();
                    pnlBedienfeld.add(lblBild);
                    lblBild.setIcon(new ImageIcon(getClass().getClassLoader().getResource("LautsprecherNeu/Lautsprecher1.gif")));
                    lblBild.setBounds(20, 35, 130, 45);
                }
                {
                    sliderWertR = new JSlider();
                    pnlBedienfeld.add(sliderWertR);
                    sliderWertR.setBounds(170, 10, 200, 45);
                    sliderWertR.setPaintTicks(true);
                    sliderWertR.setPaintLabels(true);
                    sliderWertR.setMajorTickSpacing(10);
                    sliderWertR.setMinorTickSpacing(5);
                    sliderWertR.setValue(10);
                    sliderWertR.setMaximum(100);
                    sliderWertR.setMinimum(10);
                    sliderWertR.addChangeListener(this);
                }
                {
                    lblWertR = new JLabel();
                    pnlBedienfeld.add(lblWertR);
                    lblWertR.setBounds(170, 65, 200, 25);
                    lblWertR.setText("Widerstand: "+sliderWertR.getValue()+" kOhm");
                }
                {
                    lblUeberschrift = new JLabel();
                    pnlBedienfeld.add(lblUeberschrift);
                    lblUeberschrift.setText("RC-Tiefpass");
                    lblUeberschrift.setBounds(20, 10, 100, 20);
                }
                {
                    sliderWertC = new JSlider();
                    pnlBedienfeld.add(sliderWertC);
                    sliderWertC.setBounds(410, 10, 200, 45);
                    sliderWertC.setPaintTicks(true);
                    sliderWertC.setPaintLabels(true);
                    sliderWertC.setMajorTickSpacing(10);
                    sliderWertC.setMinorTickSpacing(5);
                    sliderWertC.setValue(10);
                    sliderWertC.setMaximum(100);
                    sliderWertC.setMinimum(10);
                    sliderWertC.addChangeListener(this);
                }
                {
                    lblWertC = new JLabel();
                    pnlBedienfeld.add(lblWertC);
                    lblWertC.setText("Kondensator: "+sliderWertC.getValue()+" nF");
                    lblWertC.setBounds(410, 65, 200, 25);
                }
                {
                    btnAmp = new JButton();
                    pnlBedienfeld.add(btnAmp);
                    btnAmp.setText("Amplitudengang");
                    btnAmp.setBounds(640, 40, 150, 25);
                    btnAmp.addActionListener(this);
                }
                {
                    btnPhase = new JButton();
                    pnlBedienfeld.add(btnPhase);
                    btnPhase.setText("Phasengang");
                    btnPhase.setBounds(640, 70, 150, 25);
                    btnPhase.addActionListener(this);
                }
                {
                    lblGrafisch = new JLabel();
                    pnlBedienfeld.add(lblGrafisch);
                    lblGrafisch.setText("Grafische Darstellung von:");
                    lblGrafisch.setBounds(640, 10, 150, 20);
                }
                {
                    lblPicFormel = new JLabel();
                    pnlBedienfeld.add(lblPicFormel);
                    lblPicFormel.setBounds(810, 10, 190, 80);
                }
                {
                    lblFg = new JLabel();
                    pnlBedienfeld.add(lblFg);
                    lblFg.setBounds(640, 110, 150, 25);
                }

            }
            {
                pnlGrafik = new JPanel();
                getContentPane().add(pnlGrafik);
                pnlGrafik.setBorder(BorderFactory.createLineBorder(Color.black, 1));
                pnlGrafik.setBounds(10, 160, 1000, 600);
                pnlGrafik.setBackground(Color.white);
                pnlGrafik.setVisible(true);
            }           
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource()== btnAmp)
        {
            double wertR=(double)sliderWertR.getValue()*1000;
            double wertC=(double)sliderWertC.getValue()/1000000000;
            double fg=gAmplitude.berechAmp(wertR,wertC);
            lblFg.setText("Grenzfrequenz: "+Math.round(fg));
            pnlGrafik.remove(gPhase);
            gAmplitude.repaint();
            pnlGrafik.add(gAmplitude);
            lblPicFormel.setIcon(new ImageIcon(getClass().getClassLoader().getResource("LautsprecherNeu/picFormelDB.gif")));
        }
        if (e.getSource()== btnPhase)
        {
            double wertR=(double)sliderWertR.getValue()*1000;
            double wertC=(double)sliderWertC.getValue()/1000000000;
            double fg=gPhase.berechAmp(wertR,wertC);
            lblFg.setText("Grenzfrequenz: "+Math.round(fg));
            pnlGrafik.remove(gAmplitude);
            gPhase.repaint();
            pnlGrafik.add(gPhase);
            lblPicFormel.setIcon(new ImageIcon(getClass().getClassLoader().getResource("LautsprecherNeu/picFormelPhase.gif")));
        }
    }
     public void stateChanged(ChangeEvent ce)
     {
         if (!sliderWertC.getValueIsAdjusting())
         {
             lblWertC.setText("Kondensator: "+sliderWertC.getValue()+" nF");
         }
         if (!sliderWertR.getValueIsAdjusting())
         {
             lblWertR.setText("Widerstand: "+sliderWertR.getValue()+" kOhm");
         }
     }

}

Die Action Listener sind am Ende sorry wenn der Code komisch ist aber mache das noch nicht so lange :( aber ich bin lernwillig ;) bedanke mich schonmal bei zerix für die Zeit :)
 
Zuletzt bearbeitet von einem Moderator:
Okay ich hab jetzt ein 2tes Panel eingefügt und blende immer nur das gewünschte ein und hab bei den slidern den repaint befehl gesetzt
Das klappt soweit nur habe ich nach wie vor das problem das die alten Linien beim repaint nicht entfernt werden und ich dan irgendwann 500 linien habe

Code:
public void actionPerformed(ActionEvent e)
	{
		if (e.getSource()== btnAmp)
		{
			pnlGrafikAmp.setVisible(true);
			pnlGrafikPhase.setVisible(false);
			double wertR=(double)sliderWertR.getValue()*1000;
			double wertC=(double)sliderWertC.getValue()/1000000000;
			double fg=gAmplitude.berechAmp(wertR,wertC);
			lblFg.setText("Grenzfrequenz: "+Math.round(fg));
			pnlGrafikAmp.add(gAmplitude);
			lblPicFormel.setIcon(new ImageIcon(getClass().getClassLoader().getResource("LautsprecherNeu/picFormelDB.gif")));
		}
		if (e.getSource()== btnPhase)
		{
			pnlGrafikAmp.setVisible(false);
			pnlGrafikPhase.setVisible(true);
			double wertR=(double)sliderWertR.getValue()*1000;
			double wertC=(double)sliderWertC.getValue()/1000000000;
			double fg=gPhase.berechAmp(wertR,wertC);
			lblFg.setText("Grenzfrequenz: "+Math.round(fg));
			pnlGrafikPhase.add(gPhase);
			lblPicFormel.setIcon(new ImageIcon(getClass().getClassLoader().getResource("LautsprecherNeu/picFormelPhase.gif")));
		}
	}
	 public void stateChanged(ChangeEvent ce) 
	 {
		 if (!sliderWertC.getValueIsAdjusting()) 
		 {
			 lblWertC.setText("Kondensator: "+sliderWertC.getValue()+" nF");
			 double wertR=(double)sliderWertR.getValue()*1000;
				double wertC=(double)sliderWertC.getValue()/1000000000;
				double fg=gAmplitude.berechAmp(wertR,wertC);
				double fg1=gPhase.berechAmp(wertR,wertC);
				lblFg.setText("Grenzfrequenz: "+Math.round(fg));
				gAmplitude.repaint();
				gPhase.repaint();
				pnlGrafikAmp.add(gAmplitude);
				pnlGrafikPhase.add(gPhase);		 
				}
		 if (!sliderWertR.getValueIsAdjusting()) 
		 {
			 lblWertR.setText("Widerstand: "+sliderWertR.getValue()+" kOhm");
			 double wertR=(double)sliderWertR.getValue()*1000;
				double wertC=(double)sliderWertC.getValue()/1000000000;
				double fg=gAmplitude.berechAmp(wertR,wertC);
				double fg1=gPhase.berechAmp(wertR,wertC);
				lblFg.setText("Grenzfrequenz: "+Math.round(fg));
				gAmplitude.repaint();
				gPhase.repaint();
				pnlGrafikAmp.add(gAmplitude);
				pnlGrafikPhase.add(gPhase);
		 }
	 }
 
Zurück