2D-Grafik Alles auf einen Panel Zeichnen

Anil

Mitglied
Hallo Leute
ich versuche zur Zeit so etwas wie ein Paint Programm zu programmieren habe jedoch paar Probleme. Hier zuerst mal der Queltext für die grafische Oberfläche:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 11/18/2010
  * @author
  */

public class GUIneu extends JFrame {
  // Anfang Attribute
  private JPanel JPanel1 = new JPanel(null);
    private JButton JButton1 = new JButton();
    private JButton JButton2 = new JButton();
    private JButton JButton3 = new JButton();
    private JButton JButton4 = new JButton();
    private JButton JButton5 = new JButton();
    private JButton JButton6 = new JButton();
    private JButton JButton7 = new JButton();
    private JButton JButton8 = new JButton();
    private ButtonGroup jButtonGroup1 = new ButtonGroup();
  // Ende Attribute

  public GUIneu(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 1000;
    int frameHeight = 700;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);


    // Anfang Komponenten

    JPanel1.setBounds(0, 0, 1000, 700);
    JPanel1.setBackground(null);
    cp.add(JPanel1);


    JButton1.setBounds(0, 0, 50, 50);

    JButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Bleistift.JPG")));
    JButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        JButton1_ActionPerformed(evt);
      }
    });
    JPanel1.add(JButton1);
    JButton2.setBounds(0, 50, 50, 50);
    JButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Rechteck.JPG")));
    JButton2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        JButton2_ActionPerformed(evt);
      }
    });
    JPanel1.add(JButton2);
    JButton3.setBounds(0, 100, 50, 50);
    JButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Kreis.JPG")));
    JButton3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        JButton3_ActionPerformed(evt);
      }
    });
    JPanel1.add(JButton3);
    JButton4.setBounds(0, 150, 50, 50);
    JButton4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Linie.JPG")));
    JButton4.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        JButton4_ActionPerformed(evt);
      }
    });
    JPanel1.add(JButton4);
    JButton5.setBounds(0, 200, 50, 50);
    JButton5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Ratzifummi.JPG")));
    JButton5.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        JButton5_ActionPerformed(evt);
      }
    });
    JPanel1.add(JButton5);
    JButton6.setBounds(0, 250, 50, 50);
    JButton6.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Text.JPG")));
    JButton6.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        JButton6_ActionPerformed(evt);
      }
    });
    JPanel1.add(JButton6);
    JButton7.setBounds(0, 300, 50, 50);
    JButton7.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Lupe.JPG")));
    JButton7.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        JButton7_ActionPerformed(evt);
      }
    });
    JPanel1.add(JButton7);
    JButton8.setBounds(0,350, 50, 50);
    JButton8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Farbpalette.JPG")));
    JButton8.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        JButton8_ActionPerformed(evt);
      }
    });
    JPanel1.add(JButton8);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);

  }


  // Anfang Methoden
  public void JButton1_ActionPerformed(ActionEvent evt) {
      Freihandzeichnen Fenster = new Freihandzeichnen();
      Fenster.setBounds(50, 0, 1000, 700);
      JPanel1.add(Fenster);

  }


  public void JButton2_ActionPerformed(ActionEvent evt) {
     Rechtecknew win = new Rechtecknew();
     win.setBounds(50, 0, 1000, 700);
     JPanel1.add(win);
  }

  public void JButton3_ActionPerformed(ActionEvent evt) {
     Kreis kreis = new Kreis();
     kreis.setBounds(50, 0, 1000, 700);
     JPanel1.add(kreis);
  }

  public void JButton4_ActionPerformed(ActionEvent evt) {
    Linie linie = new Linie();
    linie.setBounds(50, 0, 1000, 700);
    JPanel1.add(linie);
  }

  public void JButton5_ActionPerformed(ActionEvent evt) {
      Radiergummi Radier = new Radiergummi();
      Radier.setBounds(50, 0, 1000, 700);
      JPanel1.add(Radier);
  }

  public void JButton6_ActionPerformed(ActionEvent evt) {

  }

  public void JButton7_ActionPerformed(ActionEvent evt) {
      Zoom zoom = new Zoom();
      zoom.setBounds(50, 0, 1000, 700);
      JPanel1.add(zoom);
  }

  public void JButton8_ActionPerformed(ActionEvent evt) {
    Component comp = (Component) evt.getSource();

        Color newColor = JColorChooser.showDialog(
          null, "Wähle neue Farbe", comp.getBackground() );

        JPanel1.setBackground( newColor );
  }




  // Ende Methoden

  public static void main(String[] args) {
    new GUIneu("GUIneu");
  }
}


Und dann noch die Quelltexte zum Zeichnen von Kreisen und von Rechtecken:

Rechteck:
Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Rechtecknew extends JPanel implements MouseListener, MouseMotionListener  {


  // Anfang Attribute
    private Graphics2D g2;
    private Rectangle paintRect = new Rectangle();

  // Ende Attribute


    public Rechtecknew() {
        System.out.println("Rechteck..");
        this.addMouseListener(this);
        this.addMouseMotionListener(this);

    }
    protected void paintComponent(Graphics g) {


        if (paintRect != null) {
        g2 = (Graphics2D) g;
        g2.setPaintMode();
        g.drawRect(paintRect.x, paintRect.y, paintRect.width, paintRect.height);
        paintRect.x = paintRect.width ;
        paintRect.y = paintRect.height;
        }


    }

  // Anfang Methoden


    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }


      public void mousePressed(MouseEvent e) {
        paintRect.x=e.getX();
        paintRect.y=e.getY();



      }

      public void mouseReleased(MouseEvent e) {
         paintRect.width = e.getX()-paintRect.x;
       paintRect.height = e.getY()-paintRect.y;
       repaint();

      }



      public void mouseDragged(MouseEvent e) {

      }


    public void mouseMoved(MouseEvent e) {

    }

  // Ende Methoden
}
Kreis:
Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Kreis extends JPanel implements MouseListener, MouseMotionListener {

    private int startX, startY, tempX, tempY;

    private Graphics2D g2;

    public Kreis() {
        System.out.println("Kreis..");
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    protected void paintComponent(Graphics g) {

         if (g != null) {
            g = (Graphics2D) g;
            g.drawArc(startX, startY, tempX, tempY,360 , 360);
        }
    }



    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
        startX = e.getX();
        startY = e.getY();
    }

    public void mouseReleased(MouseEvent e) {
       tempX = e.getX()-startX;
       tempY = e.getY()-startY;
       repaint();
    }

    public void mouseDragged(MouseEvent e) {


    }

    public void mouseMoved(MouseEvent e) {
    }
}

So 🙂 jetzt habe ich das Problem dass ich auf einen Panel nicht beides zeichnen kann sondern nur dass welchen Button ich zuerst gedrückt habe. Wenn ich zum Beispiel auf den Rechteck Button drücke dann kann ich hinterher kein Kreis mehr zeichnen. Wie muss ich meinen Quelltext ändern damit das funktioniert??? Wäre wirklich edel wenn mir jemand helfen könnte 🙂
 
Zuletzt bearbeitet von einem Moderator:
Wenn ich das richtig sehe zeichnest du nicht direkt auf dem Fenster sondern erzeugt jedes mal ein neues Panel mit jeweils einen Kreis bzw. einen Rechteck du müsste auch erstmal die Komponenten entfernen versuche mal getContentPane().removeAll() auf das Hauptfenster bei den beiden ActionListenern das du erst alle Komponenten entfernst.
Ein Kreis und ein Rechteck können bei deiner Implementierung eh nie gleichzeitig existieren.
 
Hmm danke erst mal für deine Antwort 🙂 hättest du mir denn einen Vorschlag wie ich alles auf einen Panel zeichnen könnte? Genau so wie z.B. beim Paint Porgramm?
 
Ja also man könnte es so machen du hast eine abstracte Oberklasse wie zum Beispiel: DrawableObject von denen du alle Klassen ableitest das sieht dann ungefähr so aus:

Java:
public abstract class DrawableObject{

         public abstract void paint(Graphics g);

}

Dann leitest du dann zum Beispiel ein Kreis ab:

Java:
public class Kreis extends DrawableObject{

private Point mitte;
private int radius;

public Kreis(Point mitte, int radius){
      this.mitte = mitte;
      this.radius = radius;
}

public void paint(Graphics g){
 // hier nun zeichnen
}
}

und in deinen Hauptframe sieht es dann so aus:

Java:
List<DrawableObject> drawables = new LinkedList<DrawableObject>();

// in der paintComponent nun so:

protected void paintComponent(Graphics g){

super.paintComponent(g);

for(DrawableObject d : drawables){
d.paint(g);
}

Das wäre de ungefähre aufbau bei weiteren Fragen immer stellen und ich würde statt Buttons ToggleButtons nehmen 😉
 
ich galube ich bin einfach zu schlecht fürs programmieren :S irgendwie funktioniert das nicht könntest du mir villeicht deine iddee mit meinem quelltext zeigen was ich wo reinbauen muss???
 

Zurück
Oben