# Kreise zeichnen



## mimix (13. Dez 2011)

Hallo,
Ich möchte statt einen Text, einen Kreis im Panel zeichnen.
Wie kann ich das tun?


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;


public class Main extends JFrame
{
	
	
	public Main(){
	JPanel gridLayout = new JPanel( new GridLayout(10, 10, 2, 2) );
	gridLayout.setBackground( Color.BLACK );
	gridLayout.setBorder(new MatteBorder(1,1,1,1, Color.RED));
	
	for (int i=0; i<100 ; i++){
		
	JLabel label = new JLabel();
		label.setText(""+i);
		label.setOpaque(true);
		gridLayout.add(label);
	}
	add(gridLayout);
	}
	
	public void zeichne(Graphics g){
		g.drawRect(10, 10, getWidth(), getHeight());
	}
    public static void main(String[] args)
    {
    	Main frame= new Main();
    	frame.pack();
    	frame.setVisible(true);
    }
}
```

Vielen Dank


----------



## Michael... (13. Dez 2011)

Wo und anstelle welchen Textes.
In Swing kann man zeichnen, in dem man eine eigene Klasse von JPanel oder JComponent erben lässt und deren paintComponent(Graphics g) überschreibt. Darin kann man mit dem darin übergebenen Graphics Objekt beliebig zeichnen (siehe API Doku zur Klasse Graphics)


----------



## earlgrey_tea (14. Dez 2011)

Willst du den Kreis in deinem [JAPI]JFrame[/JAPI] zeichnen? Falls ja dann hab ich dir unten mal den Quelltext angehängt. 

Eine Frage hab ich aber noch: 

Wo rufst du die Methode 
	
	
	
	





```
zeichnen(Graphics g)
```
 auf?
Warum zeichnet die ein Rechteck, wenn du doch einen Kreis haben willst?


```
package paintBeispiele;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;

@SuppressWarnings("serial")
public class KreisInButton extends JFrame {

	public KreisInButton() {
		JPanel gridLayout = new JPanel(new GridLayout(10, 10, 2, 2));
		gridLayout.setBackground(Color.BLACK);
		gridLayout.setBorder(new MatteBorder(1, 1, 1, 1, Color.RED));

		for (int i = 0; i < 100; i++) {

			JLabel label = new JLabel();
			label.setText("" + i);
			label.setOpaque(true);
			gridLayout.add(label);
		}
		add(gridLayout);
	}

	@Override
	public void paint(Graphics g){
		super.paintComponents(g);
		Insets inset = getInsets();
		g.drawOval(inset.left, inset.top, getWidth() - inset.right, getHeight() - 30 );
	}

	public static void main(String[] args) {
		KreisInButton frame = new KreisInButton();
		frame.pack();
		frame.setVisible(true);
	}

}
```


----------



## mimix (14. Dez 2011)

Die Rechtecke sind Labels. 
Ja, so sollte es aussehen, aber ich möchte in jedem Label ein Kreis zeichnen. Ich bin seit Stunden dran aber bekomme leider nichts hin. 

Vielen Dank


----------



## earlgrey_tea (14. Dez 2011)

Auf die Gefahr hin, dass ich mich wiederhole, aber deine Methode 
	
	
	
	





```
zeichnen(Graphics g)
```
 wird IMO nie aufgerufen. Ansonsten frag doch mal die Allwissende Müllkippe nach "Zeichnen im Label" oder ähnliches Zeugs.


----------



## earlgrey_tea (14. Dez 2011)

TaDa!: 


```
package paintBeispiele;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;

@SuppressWarnings("serial")
public class KreisInButton extends JFrame {

	public KreisInButton() {
		JPanel gridLayout = new JPanel(new GridLayout(10, 10, 2, 2));
		gridLayout.setBackground(Color.BLACK);
		gridLayout.setBorder(new MatteBorder(1, 1, 1, 1, Color.RED));

		for (int i = 0; i < 100; i++) {

			JLabel label = new MyLabel();
			label.setText("" + i);
			label.setOpaque(true);
			gridLayout.add(label);
		}
		add(gridLayout);
	}

	@Override
	public void paint(Graphics g){
		super.paint(g);
		Insets inset = getInsets();
		g.drawOval(inset.left, inset.top, getWidth() - inset.right, getHeight() - 30 );
	}
	
	public class MyLabel extends JLabel {
		
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			g.drawOval(1, 1, getWidth(), getHeight());
		}
	}

	public static void main(String[] args) {
		KreisInButton frame = new KreisInButton();
		frame.pack();
		frame.setVisible(true);
	}

}
```


Etwas kürzer, und ggf. eleganter (_ohne_ den großen Kreis): 


```
package paintBeispiele;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;

@SuppressWarnings("serial")
public class KreisInButton extends JFrame {

	public KreisInButton() {
		JPanel gridLayout = new JPanel(new GridLayout(10, 10, 2, 2));
		gridLayout.setBackground(Color.BLACK);
		gridLayout.setBorder(new MatteBorder(1, 1, 1, 1, Color.RED));

		for (int i = 0; i < 100; i++) {

			JLabel label = new JLabel() {
				@Override
				public void paint(Graphics g) {
					super.paint(g);
					g.drawOval(1, 1, getWidth(), getHeight());
				}
			};

			label.setText("" + i);
			label.setOpaque(true);
			gridLayout.add(label);
		}
		add(gridLayout);
	}


	public static void main(String[] args) {
		KreisInButton frame = new KreisInButton();
		frame.pack();
		frame.setVisible(true);
	}

}
```

Spiel am besten noch ein wenig mit den Werten rum, aber so ähnlich sollte deine Lösung dann letzten Endes auch aussehen.


----------



## Marco13 (14. Dez 2011)

Schau auch mal in http://www.java-forum.org/entwuerfe/113007-kein-swing-tutorial-2.html#post806478


----------

