# Rechteck in JPanel Zeichnen



## Evileye (13. Jan 2010)

Hi,
ich soll ein Programm schreiben das, nachdem man auf einen Button geklickt hat, ein Rechteck in ein JPanel zeichnet. Ich habe auch schon einiges, nur verstehe ich nicht ganz wo der Fehler im Quellcode liegt. Das Rechteck wird nach dem Klick nicht gezeichnet.

Hier mal meine Klassen:


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

public class GUI {

	JPanel panel;
	JButton button;
	MyPanel myPanel = new MyPanel();
	
	public GUI() {
		JFrame frame = new JFrame("Uebung 4 - Diagramm");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new FlowLayout(FlowLayout.LEFT));
		frame.setVisible(true);
		
		button = new JButton("Daten anzeigen");
		frame.getContentPane().add(button);
		
		panel = new JPanel();
		panel.setPreferredSize(new Dimension(300,300));
		panel.setBackground(new Color(200,200,255));
		
		JLabel label = new JLabel("Diagramm");
		panel.setLayout(new FlowLayout(FlowLayout.LEFT));
		panel.add(label);
		frame.getContentPane().add(panel);
				
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				button.setForeground(new Color(0,200,0));
				myPanel.setPreferredSize(new Dimension(100,100));
				panel.add(myPanel);
				panel.repaint();
			}
		});	
		
		frame.pack();		
	}

	public static void main(String[] args) {
		new GUI();
	}
}
```


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

public class MyPanel extends JComponent {
	
	private static final long serialVersionUID = 1L;

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(new Color(100,100,155));
		g.fillRect(1,1,100,100);
	}
}
```


----------



## eRaaaa (13. Jan 2010)

Hi,

rufe mal anstatt  


```
panel.repaint();
```


```
panel.validate();
```
 auf, dann sollte es funktionieren!

Gruß


----------



## Evileye (13. Jan 2010)

Super, funktioniert! Vielen dank für die schnelle Antwort.


----------



## André Uhres (13. Jan 2010)

Besser:

```
panel.revalidate();
```
Im Konstruktor sollte "frame.setVisible(true);" erst ganz zum Schluß aufgerufen werden.
Die "main" Methode sollte so aussehen:

```
public static void main(final String[] args) {
    Runnable gui = new Runnable() {

        public void run() {
            new GUI();
        }
    };
    //GUI must start on EventDispatchThread:
    SwingUtilities.invokeLater(gui);
}
```
Siehe auch: Initial Threads (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)


----------



## Evileye (14. Jan 2010)

Danke für den Hinweis und den Link.
Habs geändert.


----------



## Lirave (26. Jan 2010)

Habe jetzt jedenfalls schon mal ein Fenster, aber wie ich da drauf jetzt objecte Zeichnen kann null Plan -.-


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

public class Frame
{
  public static void main( String[] args )
  {
    JFrame   f = new   JFrame  ( "Guillotine" );
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setSize( 600, 400 );
    Dimension d = Toolkit.getDefaultToolkit().  getScreenSize()  ;
    f.setLocation( (d.width - f.getSize().width ) / 2 , (d.height - f.getSize().height) / 2 );
    f.setVisible( true );
    
  }
}
```


----------



## André Uhres (26. Jan 2010)

Erstmal eine Einführung: Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki
und ein Beispiel:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUI {
    JPanel panel;
    JButton button;
    MyPanel myPanel = new MyPanel();
    public GUI() {
        JFrame frame = new JFrame("Uebung 4 - Diagramm");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout(FlowLayout.LEFT));
        button = new JButton("Daten anzeigen");
        frame.getContentPane().add(button);
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 300));
        panel.setBackground(new Color(200, 200, 255));
        JLabel label = new JLabel("Diagramm");
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel.add(label);
        frame.getContentPane().add(panel);
        myPanel.setPreferredSize(new Dimension(100, 100));
        panel.add(myPanel);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                button.setForeground(new Color(0, 200, 0));
                myPanel.setDrawOval(true);
                myPanel.repaint();
            }
        });
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            public void run() {
                new GUI();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
class MyPanel extends JComponent {
    private static final long serialVersionUID = 1L;
    private final static Color MY_COLOR1 = new Color(100, 100, 155);
    private boolean drawOval;
    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        g.setColor(MY_COLOR1);
        g.fillRect(1, 1, 100, 100);
        if(drawOval){
            g.setColor(Color.RED);
            g.fillOval(25, 25, 50, 50);
            g.setColor(Color.BLACK);
            g.drawString("TEST", 35, 55);
        }
    }
    public void setDrawOval(boolean drawOval) {
        this.drawOval = drawOval;
    }
}
```


----------

