update()-Methode für Canvas

Status
Nicht offen für weitere Antworten.
N

new michi

Gast
Ich habe einen Funktions-Plotter geschrieben.
Damit die canvas-Komponente nicht neu-gezeichnet wird sondern nur ergänzt (die alten Funktionen also eingezeichnet bleiben) habe ich sie mit:

Code:
  public void update(Graphics g)
     {
          paint(g);
      }

ergänzt. Wie kann ich es jetzt so machen, dass die Canvas-Komponente nur ergänzt wird, wenn die boolean-Variable b1 "true" ist?
 

L-ectron-X

Gesperrter Benutzer
new michi hat gesagt.:
wenn die boolean-Variable b1 "true" ist?
Na wenn die Bedingung erfüllt ist. :wink:
Einfach in die entsprechende Methode eine Abfrage mit if-Anweisung einbauen.
Wenn die Bedingung erfüllt wird, neu zeichnen, wenn nicht überspringen oder return.
 
N

new michi

Gast
Tja...
So schlau waer ich auch, allerdings wird bei return die Canvas nicht neu gezeichnet!
 
N

new michi

Gast
Hallo!?
Kommt hier irgent wann noch mal was,
denn das Problem besteht weiterhin....
Danke
 
B

Beni

Gast
Also ich finde diesen Ansatz sehr gefährlich. Das Bild auf der Canvas kann jederzeit gelöscht werden (da reicht es, wenn ein anderes Fenster mal über dein Canvas fliegt).

Ich würde ein Image (z.B. BufferedImage) nehmen, und in das Image die Funktion(en) zeichnen. Das Image wird garantiert nie gelöscht, du kannst also immer mehr einzeichnen. Das Image selbst kannst du dann immer wieder in "paint" auf die Canvas zeichnen.
 
N

new michi

Gast
Klingt schlau, ich versteh aber nix, bin noch kein Profi wie ihr... ???:L
Kanst du das genauer erklähren???


Hier einmahl der Code:
Code:
// Datei CFunkPlotter2.java

// Ein Funktionenplotter
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

// Hauptfenster von Swing-Klasse JFrame ableiten
public class CFunkPlotter2 extends JFrame
{
int aktFunktion = 0;    // diese Variable bestimmt die 
                        // zu zeichnende Funktion;
                        // Startwert 0 = keine Funktion
CMeineCanvas m_malflaeche;
JTextField t1;
JTextField t2;
JTextField t3;
JTextField t4;
JTextField t5;
JCheckBox cb1;

   public static CFunkPlotter2 Fenster =  new CFunkPlotter2("Funktionenplotter");

public static void main(String[] args)
   {
   Fenster.pack();
   Fenster.setSize(485,585);
   Fenster.setResizable(true);
   Fenster.show();
   }

// Im Konstruktor werden die Canvas-Malfläche und 
// Schalter zur Auswahl der Funktionen angelegt
CFunkPlotter2(String titel)
   {
   super(titel);

   // Einen Layout Manager einrichten
   getContentPane().setLayout(new FlowLayout());

   // Die Malfläche aufnehmen
   m_malflaeche = new CMeineCanvas();
   getContentPane().add(m_malflaeche);
 
   // Panel-Container für Schalter anlegen
   JPanel panel = new JPanel();
   JPanel panel_Button = new JPanel();
   JPanel panel_Werte = new JPanel();
    panel.add(panel_Button);
    panel.add(panel_Werte);

     // Gitter mit 3 Zeilen, 4 Spalten
     panel_Button.setLayout(new GridLayout(3,4,10,20));     
     panel_Werte.setLayout(new GridLayout(3,3,0,0));     
     panel.setLayout(new GridLayout(2,1,10,20));     
  
     // Schalter anlegen und in Panel aufnehmen
     JButton f1 = new JButton("tan(x)");
     JButton f2 = new JButton("sin(x)");
     JButton f3 = new JButton("cos(x)");
     JButton f11 = new JButton("log(x)");
     JButton f4 = new JButton("x^2");
     JButton f5 = new JButton("x^3");
     JButton f6 = new JButton("x^z");
     JButton f7 = new JButton("x^z+s");
     JButton f8 = new JButton("a*(x^z)+s");
     JButton f9 = new JButton("a*[(x-c)^z]+s");
     JButton f10 = new JButton("a*x^z+b*x+c");
     JPanel panel_Z = new JPanel();
     JPanel panel_S = new JPanel();
     JPanel panel_A = new JPanel();
     JPanel panel_C = new JPanel();
     JPanel panel_B = new JPanel();
     JLabel l1 = new JLabel("Z:");
     t1 = new JTextField("2", 2);
     JLabel l2 = new JLabel("S:");
     t2 = new JTextField("0", 2);
     JLabel l3 = new JLabel("A:");
     t3 = new JTextField("1", 2);
     JLabel l4 = new JLabel("C:");
     t4 = new JTextField("0", 2);
     JLabel l5 = new JLabel("B:");
     t5 = new JTextField("0", 2);
     cb1 = new JCheckBox("Ergänzen");
     panel_Button.add(f1);
     f1.setMnemonic('t');
     panel_Button.add(f2);
     f2.setMnemonic('i');
     panel_Button.add(f3);
     f3.setMnemonic('o');
     panel_Button.add(f11);
     f11.setMnemonic('l');
     panel_Button.add(f4);
     f4.setMnemonic('2');
     panel_Button.add(f5);
     f5.setMnemonic('3');
     panel_Button.add(f6);
     f6.setMnemonic('z');
     panel_Button.add(f7);
     f7.setMnemonic('s');
     panel_Button.add(f8);
     f8.setMnemonic('a');
     panel_Button.add(f9);
     f9.setMnemonic('c');
     panel_Button.add(f10);
     f10.setMnemonic('b');
     panel_Werte.add(panel_Z);
     panel_Z.setLayout(new FlowLayout());
     panel_Z.add(l1);
     panel_Z.add(t1);
     panel_Werte.add(panel_S);
     panel_S.setLayout(new FlowLayout());
     panel_S.add(l2);
     panel_S.add(t2);
     panel_Werte.add(panel_A);
     panel_A.setLayout(new FlowLayout());
     panel_A.add(l3);
     panel_A.add(t3);
     panel_Werte.add(panel_C);
     panel_A.setLayout(new FlowLayout());
     panel_C.add(l4);
     panel_C.add(t4);
     panel_Werte.add(panel_B);
     panel_B.setLayout(new FlowLayout());
     panel_B.add(l5);
     panel_B.add(t5);
     panel_Werte.add(cb1);
  
   getContentPane().add(panel);


   class CMeinWindowAdapter extends WindowAdapter
      {
      public void windowClosing(WindowEvent e)
         {
         System.exit(0);
         }
      }
    
   // Das Event-Handling für die Schalter
   class CMeinActionLauscher implements ActionListener
      {
      public void actionPerformed(ActionEvent e)
         {
          String label;

          label = e.getActionCommand();
       
          if(label.equals("tan(x)"))
               aktFunktion = 1;
          if(label.equals("sin(x)"))

	aktFunktion = 2;
          if(label.equals("cos(x)"))

	aktFunktion = 3;
          if(label.equals("x^2"))
	aktFunktion = 4;
          if(label.equals("x^3"))
	aktFunktion = 5;
          if(label.equals("x^z"))
	aktFunktion = 6;
          if(label.equals("x^z+s"))
	aktFunktion = 7;
          if(label.equals("a*(x^z)+s"))
	aktFunktion = 8;
          if(label.equals("a*[(x-c)^z]+s"))
	aktFunktion = 9;
          if(label.equals("a*x^z+b*x+c"))
	aktFunktion = 10;
          if(label.equals("log(x)"))
	aktFunktion = 11;
         
         // Neuzeichnen veranlassen
         m_malflaeche.repaint();
         }
    }

   class CMeinMausMoutionLauscher implements MouseMotionListener
      {
       public void mouseMoved(MouseEvent me)
	{
	double x1 = me.getX();
	double x = Math.round( (x1 / 50 -3) * 100 ) / 100.;
	double y1 = me.getY();
	double y = Math.round( (y1 / 50 -3) * 100 ) / 100.;
	               y = y * (-1);
	CFunkPlotter2.Fenster.setTitle("Funktionenplotter - (" + x + "; " + y + ")");
	}
       public void mouseDragged(MouseEvent me)
	{
	}
      }

   // Die Lausch-Objekte anlegen
   f1.addActionListener(new CMeinActionLauscher());
   f2.addActionListener(new CMeinActionLauscher());
   f3.addActionListener(new CMeinActionLauscher());
   f4.addActionListener(new CMeinActionLauscher());
   f5.addActionListener(new CMeinActionLauscher());
   f6.addActionListener(new CMeinActionLauscher());
   f7.addActionListener(new CMeinActionLauscher());
   f8.addActionListener(new CMeinActionLauscher());
   f9.addActionListener(new CMeinActionLauscher());
   f10.addActionListener(new CMeinActionLauscher());
   f11.addActionListener(new CMeinActionLauscher());
   m_malflaeche.addMouseMotionListener(new CMeinMausMoutionLauscher());
   addWindowListener(new CMeinWindowAdapter());
   }


class CMeineCanvas extends Canvas
  {
  public void update(Graphics g)
     {
      if(cb1.isSelected())
          paint(g);

      else{
	//return; - oder was soll ich hier machen ???
               }
      }

  // Konstruktor
  CMeineCanvas() {
     // den Hintergrund auf schwarz setzen
     setBackground(Color.black);

     // Vordergrund (=Zeichenfarbe) auf blau setzen
     setForeground(Color.green);
     }

  // Die wichtigste Methode: hier wird gezeichnet!
  public void paint(Graphics g) {
    double x,y;
    int xpos,ypos;

    // Ursprung umsetzen
    g.translate(150,150);

    // Koordinatenachsen einzeichnen
    g.setColor(Color.red);
    g.drawLine(0,-150,0,150);
    g.drawLine(-150,0,150,0);
    g.drawString("-3",-150,12);
    g.drawString("-3",4,147);
    g.drawString("+3",135,12);
    g.drawString("+3",4,-140);

    // Farbe zum Zeichnen der Funktion
    g.setColor(new Color(255,255,0));
        
    // Wenn keine Funktion ausgewählt ist, nichts tun
    if(aktFunktion == 0)
	return;

    for(x= -3.0; x<=3; x += 0.005)
      {
       y = 0;
       if(aktFunktion == 1)
          y = Math.tan(x);
       if(aktFunktion == 2)
          y = Math.sin(x);
       if(aktFunktion == 3)
          y = Math.cos(x);
       if(aktFunktion == 4)
          y = Math.pow(x,2);
       if(aktFunktion == 5)
          y = Math.pow(x,3);
       if(aktFunktion == 6)
          {
          int z = Integer.parseInt(t1.getText());
          y = Math.pow(x,z);
          }
       if(aktFunktion == 7)
          {
          int z = Integer.parseInt(t1.getText());
         double s = Double.parseDouble(t2.getText());
          y = Math.pow(x,z);
          y = y + s;
          }
       if(aktFunktion == 8)
          {
          int z = Integer.parseInt(t1.getText());
         double s = Double.parseDouble(t2.getText());
         double a = Double.parseDouble(t3.getText());
          y = Math.pow(x,z);
          y = a * y;
          y = y + s;
          }
       if(aktFunktion == 9)
          {
          int z = Integer.parseInt(t1.getText());
         double s = Double.parseDouble(t2.getText());
         double a = Double.parseDouble(t3.getText());
         double c = Double.parseDouble(t4.getText());

         double x_tmp = x + c;
          y = Math.pow(x_tmp,z);
          y = a * y;
          y = y + s;
          }
       if(aktFunktion == 10)
          {
          int z = Integer.parseInt(t1.getText());
         double s = Double.parseDouble(t2.getText());
         double a = Double.parseDouble(t3.getText());
         double c = Double.parseDouble(t4.getText());
         double b = Double.parseDouble(t5.getText());
         double x_tmp1 = Math.pow(x,z);
         double x_tmp2 = b * x;
          y = a * x_tmp1 + x_tmp2 + c;
          }
       if(aktFunktion == 11)
          y = Math.log(x);

       xpos = (int) (x*50); 
       ypos = (int) (-y*50); 
       
       g.fillOval(xpos,ypos,1,1);
       }  
    }

  // Diese Methode liefert die minimale Größe der Canvas
  public Dimension getMinimumSize() {
    return new Dimension(300,300);
    }

  // Die Lieblingsgröße setzen wir auf die Minimalgröße
  public Dimension getPreferredSize() {
    return getMinimumSize();
    }
  }


} // Ende der Klasse CFunkPlotter
 
B

Beni

Gast
Wenns Dir nichts ausmacht, schreibe ich das ganze nur Pseudocodeartig auf.

Code:
public class FunctionCanvas{
   // also wie die Reihenfolge jetzt genau ist... guck besser nochmal in der API nach. Jedenfalls
  // sollte das ein Bild mit Grösse 500/500 sein.
  private Image image = new BufferedImage( BufferedImage.TYPE_INT_RGB, 500, 500 );


  // Das Bild auf das Canvas zeichnen
  public void update( Graphics g ){
    paint( g );
  }

  public void paint( Graphics g ){
    g.drawImage( image, 0, 0, this );
  }


  // Irgendeine Funktion auf das Bild zeichnen
  public void drawFunctionSowieso(){
     // Graphics erzeugen und Farbe setzen
     Graphics g = image.getGraphics();
     g.setColor( Color.RED );

     // Zeichnen
     for( ... ){
        g.fillOval( x, f(x), 1, 1 );
     }

     // Das Canvas das Bild neu zeichnen lassen.
     repaint();
  }
}

P.S. für später, überleg dir mal mit einem Interface zu arbeiten:
Code:
public interface Function{
  public double f( double x );
}
Code:
public void drawFunction( Function fun ){
     ...
     for( ... ){
        g.fillOval( x, fun.f(x), 1, 1 );
     }
     ...
}

public void drawQuadrat(){
   drawFunction( new Function(){
      public double f( double x ){
        return x*x;
      }
   });
}
Das hat den Vorteil, dass du sehr einfach verschiedene Funktionen implementieren musst, ohne dieses riesige if-else-Ding das du jetzt noch hast.
 
N

new michi

Gast
Danke ich werds mal probiren...

obs klappt schreib ich dann das nächtse mal wenn ich ins internet komm!(dauert ne weile, so'n Monat oder so)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
M GUI Update während der Verarbeitung einer Methode AWT, Swing, JavaFX & SWT 3
T ProgressBox - Update AWT, Swing, JavaFX & SWT 9
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
G update, paintComponent AWT, Swing, JavaFX & SWT 1
T GUI Update /EDT AWT, Swing, JavaFX & SWT 7
izoards JavaFX Concurrency Update UI AWT, Swing, JavaFX & SWT 35
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
A Verständnisfragen im Umgang mit update() und JFrames AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
blazingblade JavaFX Tableview Clock Column update AWT, Swing, JavaFX & SWT 5
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
W Swing ProgressBar update AWT, Swing, JavaFX & SWT 4
B IconImage update im Tabbedpane AWT, Swing, JavaFX & SWT 3
M Update überschreiben klappt nicht AWT, Swing, JavaFX & SWT 4
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
M "Update" der JTable funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V Swing Update Textarea AWT, Swing, JavaFX & SWT 2
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
El_Lobo Swing bei Update von Graphik Koordinatensystem nicht jedesmal neu zeichnen AWT, Swing, JavaFX & SWT 2
M Update JPanel AWT, Swing, JavaFX & SWT 12
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
E Swing Update JTable AWT, Swing, JavaFX & SWT 6
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
E Swing JTextField Listener nach Update?! AWT, Swing, JavaFX & SWT 2
D Swing JTable Problem bei automatischem update von Zellen AWT, Swing, JavaFX & SWT 3
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
D Swing update eines Labels nicht sichtbar AWT, Swing, JavaFX & SWT 9
N Tablle nach SQL-Update neu Laden AWT, Swing, JavaFX & SWT 4
M SWT grabExcessHorizontalSpace update ? refresh ? AWT, Swing, JavaFX & SWT 6
P Observer und GUI Update AWT, Swing, JavaFX & SWT 2
w0ddes Swing Update: Laufendes GUI updaten AWT, Swing, JavaFX & SWT 8
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
M Swing Kein update bei simulierten HTML-Link AWT, Swing, JavaFX & SWT 4
C SWT Shell update probleme - Mausbewegung nötig AWT, Swing, JavaFX & SWT 2
hdi Swing GUI update vs. Process Speed AWT, Swing, JavaFX & SWT 31
hdi Swing Gui Update Problem (EDT) AWT, Swing, JavaFX & SWT 6
C JList update über tabbedPane? AWT, Swing, JavaFX & SWT 18
M Update einer JTEextArea AWT, Swing, JavaFX & SWT 2
H JTable mySQL Update AWT, Swing, JavaFX & SWT 8
S Update des fensters beim Ersetzen von JPanels AWT, Swing, JavaFX & SWT 9
G Features nach Update löschen AWT, Swing, JavaFX & SWT 2
J Fragen zur Vererbung und Update AWT, Swing, JavaFX & SWT 12
B Update von JLabels AWT, Swing, JavaFX & SWT 2
C Habe Probleme beim Bild laden! *Update 30.11.2006* AWT, Swing, JavaFX & SWT 28
C JTreeTable update Problem AWT, Swing, JavaFX & SWT 4
S Probleme mit dem Update einer JList AWT, Swing, JavaFX & SWT 7
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
A Update von Frameinhalt und Scrollbar AWT, Swing, JavaFX & SWT 11
F MVC: Update von View und Controller AWT, Swing, JavaFX & SWT 5
C JTable update: Selektion beibehalten AWT, Swing, JavaFX & SWT 12
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
S JMenuBar + update AWT, Swing, JavaFX & SWT 3
G JTree - ungültiger selection update AWT, Swing, JavaFX & SWT 2
G Problem mit JLabel Update AWT, Swing, JavaFX & SWT 3
C [JTable] Update der Datenbank AWT, Swing, JavaFX & SWT 6
A problem mit update nach event, JSplitpane spinnt AWT, Swing, JavaFX & SWT 2
S Update von Grafik auf JPanel AWT, Swing, JavaFX & SWT 2
M update JTable AWT, Swing, JavaFX & SWT 3
T Problem bei Update von JTables in JTabbedPane AWT, Swing, JavaFX & SWT 2
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
D Swing: GUI-Update-Problem AWT, Swing, JavaFX & SWT 3
J Warum funktioniert das Update des UI nicht? AWT, Swing, JavaFX & SWT 8
I GUI-Update-Probleme AWT, Swing, JavaFX & SWT 2
G Update von JPanel nach Buttonbetätigung AWT, Swing, JavaFX & SWT 1
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
M passende Reflexion-Methode?? AWT, Swing, JavaFX & SWT 1
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
M Swing Methode datenLesen() greift auf catchBlock zu? AWT, Swing, JavaFX & SWT 25
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
Z Methode bei Boolean change neu Ausführen AWT, Swing, JavaFX & SWT 9
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Brauche Erklärung von Methode AWT, Swing, JavaFX & SWT 1
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
I Methode Draw3DRect und DrawRect AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
K Methode repaint() AWT, Swing, JavaFX & SWT 1
A Methode in bestimmten Intervall ausführen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben