# Rechteck Zeichnen



## impact (28. Okt 2010)

Nabend, suche jetzt schon seit einiger Zeit nach ner Lösung um ein Rechteck oder einen einfachen Strich zu zeichen. Ich verstehs einfach nich.
Habe awt* importiert und die Methode hier erstellt

```
public void paintRect(Graphics g){
      g.drawRect(40, 40, 10, 10);
}
```
aber wie kann ich die jetzt aufrufen??? Mein Compiler gibt immer nur ne fehlermeldung, dass Graphics nen anderes Argumet erwartet als ich angebe.
Ich versteh nicht wie ich diese Methode richtig aufrufen kann....


----------



## vladimir (28. Okt 2010)

Du kannst auf einem JPanel mit Graphics2D zeichnen, das ist relativ einfach. Du must von dem JPanel apleiten und die paint methode überschreiben. Ich müsste irgendwo ein Kodebeispiel haben. Ich werde mal nachguken vieleicht finde ich mein altes Projekt! Kurz gedulden bitte!


----------



## vladimir (28. Okt 2010)

So da habe ich es gefunden! Das war mal ein Project mit dem unterschiedliche geometrische Formen gezeichnet wurden. Ist vielleicht für den Ansatz überdimensioniert aber dort ist auch die berechnung der Verhältnise mit integriert. Schau dir das mal an, hier wird ein einfaches Quadrat gezeichnet. 

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * jPQuadrat.java
 *
 * Created on 12.06.2009, 08:34:24
 */

package geometrischeformen.rechteck;

import geometrischeformen.*;
import java.awt.*;
import javax.swing.*;
import tastaturen.*;
/**
 *
 * @author petrenko
 */
public class jPQuadrat extends javax.swing.JPanel
{
    int minabstand=6;
    boolean toushpad=false;
    double a=0.0;
    /** Creates new form jPQuadrat */
    public jPQuadrat() 
    {
        initComponents();
        initEventComponents();
    }
    /**
     * Eigene Events werden fuer Eingabefelder angelegt
     */
    private void initEventComponents()
    {
        jTFSeite.getDocument().addDocumentListener(new javax.swing.event.DocumentListener() {
        public void changedUpdate(javax.swing.event.DocumentEvent e){}
        public void removeUpdate(javax.swing.event.DocumentEvent e) {}
        public void insertUpdate(javax.swing.event.DocumentEvent e) {if(toushpad)werteBerechnen();}
});
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jBLoeschen = new javax.swing.JButton();
        jLSeite = new javax.swing.JLabel();
        jTFSeite = new javax.swing.JTextField();
        jLMm = new javax.swing.JLabel();
        jLa1 = new javax.swing.JLabel();
        jLa2 = new javax.swing.JLabel();

        setLayout(null);

        jBLoeschen.setText("Löschen");
        jBLoeschen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBLoeschenActionPerformed(evt);
            }
        });
        add(jBLoeschen);
        jBLoeschen.setBounds(50, 30, 170, 50);

        jLSeite.setText("Seite a eingeben:");
        add(jLSeite);
        jLSeite.setBounds(100, 110, 170, 50);

        jTFSeite.setText("0.0");
        jTFSeite.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTFSeiteMouseClicked(evt);
            }
        });
        jTFSeite.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTFSeiteActionPerformed(evt);
            }
        });
        add(jTFSeite);
        jTFSeite.setBounds(220, 150, 140, 50);

        jLMm.setText("mm");
        add(jLMm);
        jLMm.setBounds(60, 200, 90, 50);

        jLa1.setText("a");
        add(jLa1);
        jLa1.setBounds(220, 220, 90, 50);

        jLa2.setText("a");
        add(jLa2);
        jLa2.setBounds(170, 220, 90, 50);
    }// </editor-fold>                        

    private void jTFSeiteMouseClicked(java.awt.event.MouseEvent evt) {                                      
        callTouchNumPad(toushpad, jTFSeite);
    }                                     

    private void jTFSeiteActionPerformed(java.awt.event.ActionEvent evt) {                                         
        werteBerechnen();
    }                                        

    private void jBLoeschenActionPerformed(java.awt.event.ActionEvent evt) {                                           
        jTFSeite.setText("0.0");
        a=0.0;
    }                                          


    // Variables declaration - do not modify                     
    private javax.swing.JButton jBLoeschen;
    private javax.swing.JLabel jLMm;
    private javax.swing.JLabel jLSeite;
    private javax.swing.JLabel jLa1;
    private javax.swing.JLabel jLa2;
    private javax.swing.JTextField jTFSeite;
    // End of variables declaration                   

  /**
   * Methode zeichnet den Gehrungsschnitt
   *
   * @param g
   */
  @Override
  protected void paintComponent( Graphics g )
  {
        //2D grafische Komponente laden
        Graphics2D g2D = (Graphics2D) g;
        super.paintComponent( g2D );
        jBerechnungen berechnung= new jBerechnungen();

        //Hohe und breite des Panels
        int lHohe=this.getHeight();
        int lBreite =this.getWidth();

        //Button Loeschen positionieren und Font setzen
        jBLoeschen.setBounds(0, 0, jBLoeschen.getSize().width, jBLoeschen.getSize().height);
        jBLoeschen.setFont(this.getFont());
        //Label Seite eingeben positionieren und Font setzen
        jLSeite.setBounds(jBLoeschen.getSize().width, 0, jLSeite.getSize().width, jLSeite.getSize().height);
        jLSeite.setFont(this.getFont());
        //BTextFeld Seite eingeben positionieren und Font setzen
        jTFSeite.setBounds(jBLoeschen.getSize().width+jLSeite.getSize().width,0,jTFSeite.getSize().width,jTFSeite.getSize().height);
        jTFSeite.setFont(this.getFont());
        //Label mm positionieren und Font setzen
        jLMm.setBounds(jBLoeschen.getSize().width+jLSeite.getSize().width+jTFSeite.getSize().width, 0, jLMm.getSize().width, jLMm.getSize().height);
        jLMm.setFont(this.getFont());

        //Seite a1 Font
        jLa1.setFont(this.getFont());
        //Seite a2 Font
        jLa2.setFont(this.getFont());

        //Oberen Abstand berechnen
        int obererAbstand = jBLoeschen.getSize().height+jLa1.getSize().height;
        //Unteren Abstand berechnen
        int untererAbstand = 0;
        //Rechten Abstand berechnen
        int rechterAbstand =jLa2.getSize().width;
        //Linken Abstand berechnen
        int linkenAbstand = 0;

        int BoX = berechnung.getKleinstenInBoxWert(lHohe, lBreite, obererAbstand, untererAbstand, rechterAbstand, linkenAbstand);

        //Label a1 und a2 setzen
        jLa1.setBounds(lBreite/2, lHohe/2-BoX/2-jLa1.getSize().height, jLa1.getSize().width, jLa1.getSize().height);
        jLa2.setBounds(lBreite/2+BoX/2+2*minabstand, lHohe/2-jLa2.getSize().height/2, jLa2.getSize().width, jLa2.getSize().height);

        //Gefulltes Rechteck zeichnen mit Farbe
        g2D.setColor(new Color(244,164,96)); //Farbe setzen
        g2D.fillRect(lBreite/2-BoX/2, lHohe/2-BoX/2, BoX, BoX);

        g2D.setColor(Color.BLACK); //Farbe setzen
        //BoX Quadrat zeichnen
        g2D.drawLine(lBreite/2-BoX/2, lHohe/2-BoX/2, lBreite/2+BoX/2, lHohe/2-BoX/2);
        g2D.drawLine(lBreite/2-BoX/2, lHohe/2-BoX/2, lBreite/2-BoX/2, lHohe/2+BoX/2);
        g2D.drawLine(lBreite/2+BoX/2, lHohe/2-BoX/2, lBreite/2+BoX/2, lHohe/2+BoX/2);
        g2D.drawLine(lBreite/2-BoX/2, lHohe/2+BoX/2, lBreite/2+BoX/2, lHohe/2+BoX/2);

        g2D.setColor(Color.BLUE); //Farbe setzen
        int wert=2;
        //BoX Quadrat Abmessungen zeichnen
        g2D.drawLine(lBreite/2-BoX/2, lHohe/2-BoX/2-(minabstand+wert), lBreite/2+BoX/2, lHohe/2-BoX/2-(minabstand+wert));
        g2D.drawLine(lBreite/2-BoX/2, lHohe/2-BoX/2-wert, lBreite/2-BoX/2, lHohe/2-BoX/2-(2*minabstand+wert));
        g2D.drawLine(lBreite/2+BoX/2, lHohe/2-BoX/2-wert, lBreite/2+BoX/2, lHohe/2-BoX/2-(2*minabstand+wert));

        g2D.drawLine(lBreite/2+BoX/2+(minabstand+wert), lHohe/2-BoX/2, lBreite/2+BoX/2+(minabstand+wert), lHohe/2+BoX/2);
        g2D.drawLine(lBreite/2+BoX/2+wert, lHohe/2-BoX/2, lBreite/2+BoX/2+(2*minabstand+wert), lHohe/2-BoX/2);
        g2D.drawLine(lBreite/2+BoX/2+wert, lHohe/2+BoX/2, lBreite/2+BoX/2+(2*minabstand+wert), lHohe/2+BoX/2);
  }
    /**
   * Schaltet die Toushpadtastatur ein oder aus
   * @param option
   */
  public void setToushPad(boolean option)
  {
      toushpad=option;
  }
    /**
    * Ruft die Nummerische Touchscreen Tastatur auf,
    * wenn der Flag ts auf TRUE gesetzt wird
    * @param ts
    * @param jtf
    */
    public void callTouchNumPad(boolean ts,JTextField jtf)
    {
        if(ts)
        {
            NumTastaturdialog st= new NumTastaturdialog((JPanel)this, true,jtf);
            st.setLocation(jtf.getLocationOnScreen().x+jtf.getSize().width,
                    jtf.getLocationOnScreen().y+jtf.getSize().height);
            st.setVisible(true);
        }
    }
    /**
     * Berechnet die Werte fuer die Applikation
     */
    public void werteBerechnen()
    {
        boolean fehler=false;
        try
        {
            a=Double.parseDouble(jTFSeite.getText());
            this.repaint();
        } 
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null,"Falscher Wert: "+jTFSeite.getText(), "Fehler", JOptionPane.ERROR_MESSAGE);
            fehler=true;
        }
        if(fehler)jTFSeite.setText("0.0");
    }
}
```

Das entscheidende für dich die paintComponent zu überschreiben

```
@Override
  protected void paintComponent( Graphics g )
  {
       //2D grafische Komponente laden und damit zeichnen
        Graphics2D g2D = (Graphics2D) g;
        super.paintComponent( g2D );

      .
      .
  }
```


----------



## impact (28. Okt 2010)

Danke für die schnelle Hilfe, dass funzt auch so weit. Aber warum kann ich nicht das Recheck in einer anderen Klasse erstellen und dann in einer 2. Klassen welche den jFrame usw erstellt ausführen???


----------



## vladimir (28. Okt 2010)

Ich weis jetzt nich was Du konkret meinst aber, trenen kann man naturlich alles. Du kannst die Zeichnungsfunktion natürlich auslagern musst die allerdings mit den Übergabeparametern in der paintComponent methode aufrufen. Ich zeichne meistens alles in dem JPanel die Berechnungen werden auserhalb gemacht (ausgelagert). Das JPanel wird dan einem belibiegen Kontainer hinzugefügt. So ist mein Vorgehen. Das hat bis jetzt immer gut funktioniert!
Gruß Vladimir


----------



## Michael... (28. Okt 2010)

impact hat gesagt.:


> Aber warum kann ich nicht das Recheck in einer anderen Klasse erstellen und dann in einer 2. Klassen welche den jFrame usw erstellt ausführen???


Erstellen geht schon, nur gezeichnet wird direkt oder indirekt in der paintComponent() der darstellenden Komponente.


----------



## impact (28. Okt 2010)

OK hab das jetzt hinbekommen, zwar anders als ich zu Anfang dachte aber egal..
Hab jetzt aber noch ein weiteres Problem. Ich habe mein Rechteck auf dem normalen Frame gezeichnet und es wird auch angezeigt, habe aber zusätzlich ein Label erstellt. Das wird nicht angezeigt...
Überschreibt da die paint Methode das komplette Fenster wieder oder warum ist das so??


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

public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();
    }

    public void paint( Graphics g)
    {
        g.drawRect(100, 200, 50, 50);
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("TEST");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(139, 139, 139)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(338, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(113, 113, 113)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(233, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

  

    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    // End of variables declaration

}
```


----------



## Der Müde Joe (28. Okt 2010)

Man sollte nie Swing mit AWT mischen.
Wenn man AWT benutzt: paint überschreiben.
Wenn man Swing benutzt: paintComponent überschreiben.

Zudem sollte man nie direkt in ein JFrame malen! Schön ein JPanel
nehem, darin die paintComponent überschreiben...das Panel dem
JFrame adden und gut ist.


----------



## impact (28. Okt 2010)

Hab ich jetzt soweit gemacht denke ich. Das JPanel wird auch im Frame angezeigt, ich kann aber nicht im Panel Zeichnen. Hab das so gemacht...


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

public class NewJFrame extends javax.swing.JFrame {

    DrawLine draw = new DrawLine();
    
    public NewJFrame() {

        initComponents();

        JPanel p = new JPanel();
        p.setBackground(Color.red);
        p.setSize(200, 200);
        p.setLocation(20, 20);
        p.add( draw );
        p.repaint();
        this.getContentPane().add(p);
    }
```



```
public class DrawLine extends JPanel{

      @Override
  public void paintComponent( Graphics g )
  {    
   
    g.drawLine(10, 101, 10, 10);
  }


}
```


----------



## Michael... (29. Okt 2010)

Du siehst nichts, da das Panel p FlowLayout verwendet und Dein DrawPanel eine PreferredSize <= 10x10 besitzt (die vom FlowLayout zur Darstellung der Komponenten verwendet wird)

Setze das DrawPanel doch mal direkt auf den JFrame.
oder
Gib dem DrawPanel mal eine PreferredSize von mindestens 11x101
oder
Zeichne die Linie ab 0, 0
oder
Verwende auf dem JPanel p einen anderen LayoutManager (z.B. BorderLayout, mit DrawingPanel im CENTER Bereich)


----------

