Auf JPanel zeichnen

Status
Nicht offen für weitere Antworten.

michi2

Bekanntes Mitglied
Hallo,
Hier hatt man mit nahegelegt das ich die Canvas/JPanel neuschreiben soll und das ich mir die dazugehörigen Grundlagen in Tutorials und diesem Forum suchen soll. Allerdings find ich dazu absolut nix (bin wohl zu blöd zum suchen).
Habt ihr Links?

Ich weiß das gehört eigentlich ins Tut.-Forum, aber es ist ja kein Link auf ein Tut sondern eine Frage... und ins Tut-Forum schauen weniger Leute...
 

michi2

Bekanntes Mitglied
Also, ich versteh das noch nicht wirklich:
Wie soll ich zeichnen wen ich getGraphics() nicht aufrufen darf?
 

michi2

Bekanntes Mitglied
Währe folgendes in Ordnung?

Code:
class CMeineCanvas extends JPanel
   {
   CMeineCanvas()
      {
      setBackground(Color.black);	// den Hintergrund auf schwarz setzen
      setForeground(Color.green);	// Vordergrund (=ZeichenFarbe) auf blau setzen
      }
   public void paintComponent(Graphics g)
      {
      super.paintComponent(g);
      g.drawImage(Image img, 0, 0, observer);
      }

   
   //Zeichnet einen Wert
   void paintValue(int xpos, int ypos)
      {
      img.getGraphics().fillOval(xpos,ypos,1,1);	//Ein Oval zeichnen
      repaint();
      }


   
   // Diese Methode liefert die minimale Größe der Canvas
   public Dimension getMinimumSize()
      {
      return CFunkPlotter2.FP.di;
      }
   
   // Die Lieblingsgröße setzen wir auf die Minimalgröße
   public Dimension getPreferredSize()
      {
      return getMinimumSize();
      //return new Dimension(3*getToolkit().getScreenResolution(),3*getToolkit().getScreenResolution());
      }
   }//Ende CMeineCanvas

Würde doch immer alles löschen was auf der JPanel ist wenn paintValue() aufgerufen wird, oder?


Michi
 

michi2

Bekanntes Mitglied
Könntet ihr mir bitte das ein wenig erklären, die Anleitungen die ihr mir gebt wiedersprechen zimlich den Regeln die Wildcard mir hier gegeben hat.
 
B

Beni

Gast
Wildcard hat in allen Punkten recht, nur etwas könnte man noch hinzufügen: das Graphics darf man von einer Methoden in die nächste reichen.

Im übrigen hat dein Quellcode Syntaxfehler, und kann deshalb nicht richtig sein :wink:

Grundsätzlich zeichnet man mit Swing immer etwa so:
Code:
public class X extends JPanel{
  // paintComponent überschreiben
  public void paintComponent( Graphics g ){
    super.paintComponent( g ); 

    // entweder direkt was in der Methode zeichnen
    g.setColor( Color.RED );
    g.fillOval( 0, 0, getWidth(), getHeight() );

    // oder an eine andere Methode delegieren
    paintSomething( g );
  }

  private void paintSomething( Graphics g ){
    g.setColor( Color.GREEN );
    g.drawRect( 17, 18, 42, 47 );
  }
}

Manchmal ist das Bild das man haben will aber sehr kompliziert. Da "paintComponent" nur wenige Millisekunden Zeit hat, etwas auf den Bildschirm zu zaubern, muss man im vorraus arbeiten. Das macht man dann mit einem Image.

Etwa so:
Code:
public class Y extends JPanel{
  private BufferedImage image;

  public void paintComponent( Graphics g ){
    super.paintComponent( g );
    // Das Bild zeichnen wir nur, wenn es auch existiert....
    if( image != null )
      g.drawImage( image, 0, 0, this );
  }

  // Die Methode rufen wir "zu einem geeigneten Zeitpunkt" auf.
  // Zum Beispiel wenn wir neue Daten kennen, oder irgendwie
  // wissen, dass das Bild jetzt anders aussehen muss.
  // Die Methode könnten wir aus einem "actionPerformed" aufrufen...
  public void createTheFancyImage(){
    // das Bild mit der richtigen Grösse erzeugen...    
    image = new BufferedImage( ... );
 
    // Grahpics des Bildes holen, um auf das Bild zu zeichnen
    Graphics imgG = image.getGraphics(); 

    imgG.setColor( Color.RED );

    ... // hier ein paar 1000 Methodenaufrufe

    repaint();
  }
}

Ansonsten muss ich leider sagen, ich versteh dein Problem nicht. Wie schon meine Vorredner sagten, im Netz gibt es 1000 Beispiele...
 

michi2

Bekanntes Mitglied
OK, danke das hiltf mir weiter!

Ansonsten muss ich leider sagen, ich versteh dein Problem nicht. Wie schon meine Vorredner sagten, im Netz gibt es 1000 Beispiele...
Alerdings scheinen die gut verstekt zu sein ;) Google und Co finden nix... Oder nach was muss ich da suchen? ("JPanel paint", "JPanel zeichen" und a bringen nix)
 
G

Gast

Gast
Also wenn du auf ein JPanel zeichnen willst, dann mach das so:

überschreibe die paintComponent(...) Methode zb so:

public void paintComponent(Graphics g){




super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g.create();
// fuer schoene Kanten
Graphics2D g2 = g2d;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.dispose();

}

alles was du zeichnen willst muss vor g2d.dispose() stehen.

wenn du zeichnen willst, kannste das mit g2d.... machen

zb. g2d.drawString("hallo",50,50);
g2d.setColor(...)
g2d.drawLine(...)
 

michi2

Bekanntes Mitglied
Ok, hab das jetzt auf dieser Grundlage neu geschrieben.
Ist das so in Ordnung?
Code:
package plotter;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.math.*;


class CMeineCanvas extends JPanel
   {
   NLogCoordinateSystem notLogSys;
   SLogCoordinateSystem simpleLogSys;
   DLogCoordinateSystem dualLogSys;
   private BufferedImage image; 
   
   CMeineCanvas()
      {
      setBackground(Color.black);	// den Hintergrund auf schwarz setzen
      setForeground(Color.green);	// Vordergrund (=ZeichenFarbe) auf grün setzen
      }
   
   public void paintComponent( Graphics g )
      {
      super.paintComponent( g );
      // Das Bild zeichnen wir nur, wenn es existiert
      if( image != null )
         g.drawImage( image, 0, 0, this );
      } 
   
   
   // Die wichtigste Methode: hier wird gezeichnet!
   public void paintfunk()
      {
      //Die Farbe wird aus einem Array genomen, w ist der Zähler
      int w = CFunkPlotter2.FP.w;
      w++;
      if(w>CFunkPlotter2.FP.Farbe.length-1)
         {
         w=0;
         }
      if(image==null)
         image = new BufferedImage((int) getMinimumSize().getWidth(),
      (int) getMinimumSize().getHeight(), BufferedImage.TYPE_INT_RGB);
      Graphics g = image.getGraphics();	//Graphics erzeugen
      
      //Über prüfen ob die alte Funktion erhalten werden soll, wenn nicht -> löschen
      if(!CFunkPlotter2.FP.cb1.isSelected())
         {
         g.clearRect(0,0,(int) CFunkPlotter2.FP.di.getWidth(),(int) CFunkPlotter2.FP.di.getHeight());
         CFunkPlotter2.FP.werte.setText("");
         w=0;
         }
      
      //Es wird überprüft welcher Typ von Koordinatensystem verwendet werden soll
      switch ( CFunkPlotter2.FP.CoordinateType)
         {
         case 'n':	//n: not (LogarithmikCoordinateSystem)
         notLogSys = new NLogCoordinateSystem( CFunkPlotter2.FP, w);
         g = notLogSys.paintCoordinateSystem(g);
         break;
         
         case 's':	//s: simpel (LogarithmikCoordinateSystem)
         simpleLogSys = new SLogCoordinateSystem( CFunkPlotter2.FP, w);
         g = simpleLogSys.paintCoordinateSystem(g);
         break;
         
         case 'd':	//d: double (LogarithmikCoordinateSystem)
         dualLogSys = new DLogCoordinateSystem( CFunkPlotter2.FP, w);
         g = dualLogSys.paintCoordinateSystem(g);
         break;
         
         default:
         System.out.println("Es scheint das sich hier ein Fehler eingeschlichen hat.\n Bitte informieren sie mich: über [url]http://www.schoenitzer.de\n[/url] Vielen Dank!");
         }
      
      // Wenn keine Funktion ausgewählt ist, nichts tun
      if( CFunkPlotter2.FP.aktFunktion == 0)
         return;
      
      //Parameter abfragen
      double[] para = CFunkPlotter2.FP.getParams();
      if(para == null)
         return;
      
      // Die Funktion generieren
      Funk f = new Funk(para);
      f.funk =  CFunkPlotter2.FP.aktFunktion;
      
      //Eintragen der Beschreibung der Funktion und des Schnittpunktes mit der  y-Achse in die Info-box
      CFunkPlotter2.FP.werte.append(f.beschreibung()+"\n");
      if(!Double.isNaN(f.yWert(0)) && !Double.isInfinite(f.yWert(0)))
         CFunkPlotter2.FP.werte.append("Schnittpunkt mit der y-Achse bei y = "+Math.rint(f.yWert(0)*1000)/1000+"\n");
      else
      CFunkPlotter2.FP.werte.append("Kein Schnittpunkt mit der y-Achse!\n");
      
      
      //Es wird überprüft welcher Typ von Koordinatensystem verwendet werden soll (siehe oben)
      switch ( CFunkPlotter2.FP.CoordinateType)
         {
         case 'n':
         notLogSys.paintFunk(f);
         break;
         
         case 's':
         simpleLogSys.paintFunk(f);
         break;
         
         case 'd':
         dualLogSys.paintFunk(f);
         break;
         
         default:
         System.out.println("Es scheint das sich hier ein Fehler eingeschlichen hat.\n Bitte informieren sie mich: über [url]http://www.schoenitzer.de\n[/url] Vielen Dank!");
         }
      CFunkPlotter2.FP.w = w;
      repaint();		//###Nötig?
      }
   
   //Zeichnet einen Wert
   void paintValue(int xpos, int ypos, Color paintingC)
      {
      Graphics gr = image.getGraphics();
      gr.setColor(paintingC);
      gr.fillOval(xpos,ypos,1,1);	//Ein Oval zeichnen
      repaint();		//n: not (LogarithmikCoordinateSystem)
      }      
   
   
   // Diese Methode liefert die minimale Größe der Canvas
   public Dimension getMinimumSize()
      {
      return CFunkPlotter2.FP.di;
      }
   
   // Die Lieblingsgröße setzen wir auf die Minimalgröße
   public Dimension getPreferredSize()
      {
      return getMinimumSize();
      //return new Dimension(3*getToolkit().getScreenResolution(),3*getToolkit().getScreenResolution());
      }
   }//Ende CMeineCanvas
 

michi2

Bekanntes Mitglied
Servus Wildcard, das komische Problem, durch das du mich erst auf das gebracht hast besteht übrigens weiterhin... Glaub aber das ich's lösen kann, wenn nicht werd ich nochmal fragen...

Hoffe ich geh euch nicht al zu sehr auf die Nerven :(
 
G

Guest

Gast
Wildcard hat gesagt.:
@Gast
Warum denn ein neues Graphics Objekt?

dann habe ich ein Graphics2D Objekt und kann damit schöner zeichnen. Kantenglättung und sowas is auch drin.

oder lieg ich da falsch?
 
G

Guest

Gast
Wildcard hat gesagt.:
Das übergebene Graphics Objekt ist bereits ein Graphics2D. Einfach casten :wink:

tja wieder was gelernt ;)

Hatte das vor ner ganzen Weile mal so ausm Internet und immer so benutzt ;)
 
B

Beni

Gast
Für mich sieht das brauchbar aus.

Wenn du dein Panel in einem (J)Frame hast, und du das Frame minimierst, und anschliessend wieder vergrössern, und dann das Bild noch da ist - dann hast du alles richtig gemacht.
 

michi2

Bekanntes Mitglied
Ja, hällt bei mir allen tests stand.
Nach deinem Beispiel war das umschreiben/neuschreiben garnicht viel Arbeit! Solltest wenn du Lust hast, das vielleicht in die FAQ herfen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
T Oval auf ein JPanel zeichnen AWT, Swing, JavaFX & SWT 3
S Swing Bild in JPanel in ScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 2
H String auf Knopfdruck in JPanel zeichnen. AWT, Swing, JavaFX & SWT 6
L Freies zeichnen auf JPanel AWT, Swing, JavaFX & SWT 3
das-mo AWT In JPanel 2mal zeichnen AWT, Swing, JavaFX & SWT 3
R JPanel auf JFrame neu zeichnen AWT, Swing, JavaFX & SWT 11
P RAM-Auslastung - Problem. Zeichnen von JPEGs auf JPanel AWT, Swing, JavaFX & SWT 2
A Swing Zeichnen auf JPanel AWT, Swing, JavaFX & SWT 4
B Zeichnen von Bildern auf JPanel aus eigenem Objekt AWT, Swing, JavaFX & SWT 19
B Swing JPanel in Abhängigkeit von DefaultListModel Instanz neu zeichnen AWT, Swing, JavaFX & SWT 3
S auf einem mit Netbeans (GUI) erstellten JPanel (eines JFrames) zeichnen? AWT, Swing, JavaFX & SWT 7
Sammay Swing JPanel nach dem einfügen neu zeichnen AWT, Swing, JavaFX & SWT 6
N JPanel zeichnen AWT, Swing, JavaFX & SWT 4
V Bild auf JPanel zeichnen AWT, Swing, JavaFX & SWT 9
G Swing Kreise auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
V Zeichnen auf JPanel und in JFrame einfügen AWT, Swing, JavaFX & SWT 16
D In JPanel zeichnen AWT, Swing, JavaFX & SWT 11
E Rechteck in JPanel Zeichnen AWT, Swing, JavaFX & SWT 6
S Koordinaten aus Array verwenden zum zeichnen auf JPanel?! AWT, Swing, JavaFX & SWT 3
0din Jpanel will nich alles zeichnen AWT, Swing, JavaFX & SWT 15
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
J Swing JScrollPane nimmt das JPanel zum Zeichnen nicht an AWT, Swing, JavaFX & SWT 5
R JPanel - zeichnen in skalierten Bereich - Linie (X-Achse) nicht sichtbar AWT, Swing, JavaFX & SWT 11
B Zeichnen in jPanel AWT, Swing, JavaFX & SWT 2
R JPanel - Markierung an der Mausposition zeichnen AWT, Swing, JavaFX & SWT 4
R JPanel in JScrollPane - zeichnen der Mausposition AWT, Swing, JavaFX & SWT 3
R JPanel in JScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 7
R JPanel - zeichnen eines Arrays AWT, Swing, JavaFX & SWT 18
G JPanel neu zeichnen mit repaint AWT, Swing, JavaFX & SWT 15
W Zeichnen verschiedener geom. Figuren in einem JPanel AWT, Swing, JavaFX & SWT 5
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
F JPanel übereinander zeichnen AWT, Swing, JavaFX & SWT 4
S Zeichnen in einem JPanel AWT, Swing, JavaFX & SWT 15
N Formen drehen und auf JPanel zeichnen AWT, Swing, JavaFX & SWT 6
B JPanel + Zeichnen AWT, Swing, JavaFX & SWT 3
S Problem mit dem Zeichnen einer Linie auf einem JPanel AWT, Swing, JavaFX & SWT 30
H Punkte auf einem JPanel zeichnen AWT, Swing, JavaFX & SWT 4
G Auf JPanel zeichnen? AWT, Swing, JavaFX & SWT 2
P JPanel Inhalt neu zeichnen AWT, Swing, JavaFX & SWT 5
feuervogel in Jpanel zeichnen AWT, Swing, JavaFX & SWT 3
M JPanel ausserhalb von paintComponent zeichnen AWT, Swing, JavaFX & SWT 6
L Komponente und Grafik gleichzeitig auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen


Oben