Announcement

Collapse
No announcement yet.

Zeichnen mit Swing: bestehende "Zeichnung" ändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeichnen mit Swing: bestehende "Zeichnung" ändern

    Hallo!

    Hier ein kleines Beispiel ()

    SwingPaintDemo2.java
    Code:
    public class SwingPaintDemo2 {
    	   
    	public static void main(String[] args) {
    		// Frame
    		JFrame f = new JFrame("Swing Paint Demo");
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.setSize(300, 200);
    		// Panel
    		MyPanel p = new MyPanel();
    		p.setBackground(Color.BLUE);
    		f.add(p);
    		f.setVisible(true);
    	}
    
    }
    MyPanel.java
    Code:
    import javax.swing.JPanel;
    import javax.swing.BorderFactory;
    import java.awt.Color;
    import java.awt.Graphics;
    
    class MyPanel extends JPanel {
    
    	public MyPanel() {
    		setBorder(BorderFactory.createLineBorder(Color.black));
    	}
    
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		g.setColor(Color.WHITE);
    		// Draw Text
    		g.drawString("This is my custom Panel!",10,20);
    		// Draw Text
    		g.drawLine(100, 100, 150, 50);
    	}
    	
    }
    (Von der Sun-Seite geklaut und etwas angepasst.)

    Wie kann man nun etwas dazuzeichnen, z.B. eine Linie, oder die bestehende "Zeichnung" ändern, z.B. die Linie länger machen?

  • #2
    http://java.sun.com/j2se/1.5.0/docs/.../Graphics.html
    Christian

    Comment


    • #3
      Danke für den Link, aber der hilft mir an dieser Stelle leider nicht weiter. Dass mit Hilfe eines Graphics-Objektes gezeichnet wird, weiß ich und auch sonst kann ich den Code gut nachvollziehen. Mein Verständnisproblem ist, dass ich nicht verstehe, wie in einem schon laufenden Programm etwas dazugezeichnet oder geändert werden kann, wie ist das möglich (und möglich ist das ja), wenn alles, was mit dem Zeichnen zu tun hat, einmal in der paintComponent() festgeschriben und nicht geändert werden kann (man kann ja nicht etwa den Code der Methode ändern)? Das ist das, was ich nicht verstehe. Vielleicht kannst Du / kann jemand mir das erklären. Danke im Voraus.

      Comment


      • #4
        Eine wesentliche Voraussetzung für alle Fensterprogramme ist, dass jedes Fenster zu jeder Zeit wissen muss, wie es sich darstellen soll. Das kann das Betriebssystem oder Framework nicht wissen.

        Immer wenn ein Fenster sein Inhalt darstellen soll wird ein "paint" Event an jede Komponente gesandt. In der stellt sich das Fenster dann dar.

        Dieses entfällt, bei den Standardcomponenten (Liste, Combobox usw.) von diesem "weiss" das Framework wie sie darzustellen sind und kann sie demzufolge darstellen.


        Wenn du nun eigene grafischen Ausgaben machst, musst du in der Paintmethode dafür sorgen, dass das aktuelle Bild gezeichnet wird.

        Warum du die Paintmethode nicht ändern kannst verstehe ich allerdings nicht.


        Wie kann man nun etwas dazuzeichnen, z.B. eine Linie, oder die bestehende "Zeichnung" ändern, z.B. die Linie länger machen?
        widerspricht irgendwie
        Dass mit Hilfe eines Graphics-Objektes gezeichnet wird, weiß ich und auch sonst kann ich den Code gut nachvollziehen......
        Christian

        Comment


        • #5
          Mit "dazuzeichnene/verändern" meine ich "dazuzeichnene/verändern", wenn der Code schon übersetzt ist. Wenn ich also z.B. weiß, dass ich eine bestimmte Linie mit Koordinaten x1, y1, x2, y2 haben will, dann gehe ich einfach in die paintComponent() und sage g.drawLine(x1, y1, x2, y2); -- fertig. Was mach ich aber, wenn sich erst später feststellen soll, ob und wie die Linie gezeichnet werden soll?

          Ich meine so was wie:

          Code:
          main() {
          ...
          if(...) {
          panelSoUndSoDesFenstersSoUndSo.zeichneWas(etwasWasGezeichnetWerdenSoll);
          }
          ...
          }
          Zuletzt editiert von automatix1311; 16.05.2009, 16:43.

          Comment


          • #6
            Grundsätzlich kannst du dir zur Laufzeit den Graphics holen und darauf rummalen. Wenn du das "einmalig" machst, "verletzt" du o.a. Regel. Die Folge ist, dass zwar dann beim malen deine Striche zu sehen sind, aber wenn mit dem Fenster eine Operation durchgeführt werden die Striche verschwinden.

            Mögliche Lösungen sind:

            - Alle Grafikoperationen werden "gemerkt" und können immer ergänzt werden (bsp. in einer Liste). es können welche hinzugefügt werden und auch gelöscht werden.

            - Immer wenn man was gezeichnet hat, macht man einen Screeshot von dem Graphics und im Paint zeichnet man nur immer das aktualisierte Bild
            Christian

            Comment


            • #7
              OK, wie ich auch vermutet habe, ist wohl meine Vorgehensweise grundsätzlich falsch -- meinPanel.zeichneMalWas(meineLinie) wird wohl nicht so ohne Weiteres gehen (jedenfalls ohne, dass die paintComponent() das bei nächster Gelegenheit wieder rückgängig macht)...

              Comment

              Working...
              X