# Paint-Methode aufrufen



## TheKing (1. Jul 2009)

Ich hab schon gegoogelt, aber nichts wirklich hilfreiches gefunden. Also: 
Ich habe ein Fenster, mit einem einfachem JPanel und einem JButton. Wenn man auf den Button klickt soll ein Kreis ins JPanel gezeichnet werden.
Mit

```
Graphics grafik = getGraphics();
```
würde mir da schon eine Lösung einfallen.
Mit "public void paint(Graphics grafik) {".. aber nicht. Hat jemand eine Idee?


----------



## Der Müde Joe (1. Jul 2009)

Man macht NIE getGraphics()

zeichnen tut man immer in der paintComponent methode, welche man überschreiben hat (im JPanel)


----------



## Lexi (1. Jul 2009)

Du überschreibst einfach die paintComponent von deinem Panel, in der bei einem gesetzten Flag ein Kreis in das Panel gezeichnet wird.
Wenn der Button gedrückt wird, setzt du das Flag auf true, repaintest das Panel und setzt danach das Panel wieder auf false.


----------



## Tobias (1. Jul 2009)

```
public class KreisPanel extends JPanel {

    boolean drawCircle = false;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(drawCircle) {
             // Kreis zeichnen
        }
    }
}
```

In Swing wird in der Regel die Methode paintComponent() überschrieben, nicht die Methode paint().
Irgendwo außerhalb der paint*()-Methoden getGraphics() aufzurufen ist normalerweise ein Fehler, weil man damit meistens kein bzw nicht das richtige Graphics-Objekt erhält.


----------



## TheKing (1. Jul 2009)

ich hab mir mal kurz einen (nicht sehr ordentlichen ) Code zusammengebastelt...

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

package paint;


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
 *
 * @author Admin
 */
public class Main extends JFrame implements ActionListener {

    private JButton knopf;
    private boolean button_click;

    public Main() {

       super("Java-Zeichnen");


       JPanel panel = new JPanel();
       knopf = new JButton("Drück");
       knopf.addActionListener(this);
       panel.setLayout(new GridLayout(6, 0));
       panel.add(knopf);
       setContentPane(panel);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main fenster = new Main();
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(900, 900);
        fenster.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (button_click == false) {
 button_click = true;
 } 
repaint();
        }


    public void paint(Graphics g) {
        g.setColor(Color.red);
        if (button_click) {
         int x = (int) (Math.random() * 901);
         int y = (int) (Math.random() * 901);
       g.fillRect(x, y, 100, 100);
       } 
    }


 }
```


----------



## Der Müde Joe (1. Jul 2009)

public void paint(Graphics g) {

paintComponent!!!

Nicht direkt ins JFrame malen sondern die paintComponent des JPanels überschreiben und darin malen.
Siehe auch:
http://www.java-forum.org/java-basics-anfaenger-themen/85170-klasse-aufrufen.html


----------



## Tobias (1. Jul 2009)

// überholt


----------



## TheKing (1. Jul 2009)

So:

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

package paint;


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

/**
 *
 * @author Admin
 */
public class Main extends JFrame  {


    private JLabel label;
    private boolean button_click;

    public Main() {

       super("Java-Zeichnen");


       JPanel panel = new JPanel();
       panel.setLayout(new GridLayout(6, 0));

       label = new JLabel("Malen mit Java:");
       zeichne z =  new zeichne();

       panel.add(label);
       panel.add(z);
       
      setContentPane(panel);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main fenster = new Main();
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(900, 900);
        fenster.setVisible(true);
    }



class zeichne extends JPanel {
    @Override

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(100, 10, 100, 100);
       
    }

}
 }
```


----------



## Tobias (1. Jul 2009)

Und? Ist da irgendwo eine Frage versteckt?


----------



## TheKing (3. Jul 2009)

Ok. Da wir ja keinen neuen Thread eröffnen wollen:
Ich bin dabei ein kleines (betone "kleines") Spiel in Java zu programmieren. Da ich ja mit der Paint Methode sehr viele "ausernandersetzungen" hatte , hab ich noch ein paar kleine Test's gemacht. Aber es zeichnet mir nichts hin:????:L

```
package paint_test;

//Importieren 
import javax.swing.*;
import java.awt.*;

/**
 *
 * @author admin
 */
public class Main extends JFrame {

    public Main() {


        super("Paint");

        JPanel panel = new JPanel();

        Ball ball = new Ball();
        panel.add(ball);

        setContentPane(panel);
    }

    public class Ball extends JPanel {

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.red);
            g.drawRect(100, 100, 100, 100);

        }
    }

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {
        
        Main fenster = new Main();
        fenster.setSize(600, 500);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setVisible(true);
    }
}
```
Was ist daran falsch?:rtfm:;(


----------



## Schandro (3. Jul 2009)

Das JPanel "panel" hat das FlowLayout als Layoutmanager per default gesetzt. Dieser stellt deine Instanz von Ball mit 10x10 Pixeln dar, da dies die default-Preferredsize von JPanel ist (und Ball ist ja ein JPanel...). Änder den Konstruktor z.b. auf das hier:

```
public Main() {
        super("Paint");

        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        Ball ball = new Ball();
        panel.add(ball);

        add(panel);
    }
```


----------



## TheKing (3. Jul 2009)

Danke.JUHU

Könnte man das auch mit einem anderen Laayout Manager wie z.B dem GridLayout machen?


----------



## Leroy42 (3. Jul 2009)

:shock:

Sorry, habe auch keine Ahnung! 

Aber besoffen bin ich doch noch gar nicht! 

Wenn du statt
setContentPane(panel);
schreibst:
setContentPane(ball);

dann geht es komischerweise aber den
eigentlichen Fehler sehe ich auch nicht ???:L

Sollte doch eigentlich klappen.

Geh' dann mal lieber ins Wochenende.


----------



## Schandro (3. Jul 2009)

> Könnte man das auch mit einem anderen Laayout Manager wie z.B dem GridLayout machen?


Du kannst das Layout benutzen das dich glücklich macht. Du musst das Layout halt nur so wählen das alles so dargestellt wird wie du es willst. Grundsätzlich ist mit dem GridLayout aufjedenfall viel mehr möglich als mit dem BorderLayout.

Oder war das jetzt ne Frage danach wie der selbe Code mit dem GridBagLayout konkret aussehen würde? :bahnhof:


----------



## André Uhres (4. Jul 2009)

Related reading: Malen in Swing Teil 1: der grundlegende Mechanismus


----------

