# auf einer Leinwand zeichnen



## bliko (10. Feb 2008)

Ich habe auf einem Panel mehrere Komponenten, mit paintComponents() habe ich eine einfach Grafik (ein quadrat mit den jeweiligen Punkten gezeichnet. Das wird natürlich von den Komponenten überschrieben. Jetzt möchte ich die Zeichnung auf die Leinwand bringen und habe das mit 

Graphics g = leinwand.getGraphics(); versucht. Was immer ich auch zu zeichnen versuche, es kommt eine NullPointerException-Meldung. Ich möchte über die Textfelder Punkte eingeben können, die dann auf der Leinwand durch Linien verbunden ausgegeben werden. Hier nun der Code:


```
package geometrischeFormen;

/**
 * Die Klasse MyPanel erbt von JPanel Eigenschaften und Methoden; dadurch können
 * "Komponenten" der Klasse Component gezeichnet werden.
 */

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;
import java.lang.*;
import java.util.*;

public class GeomFormen extends JPanel implements ActionListener
{
	private Color[] farben = {Color.white, Color.black, Color.blue,
				  	  Color.red, Color.yellow, Color.cyan, 
					  Color.lightGray, Color.magenta, Color.green, Color.darkGray};
	private Dimension dim = new Dimension(650,450);
	private Font f = new Font("SansSerif", Font.PLAIN, 14);
	private Punkte a,b,c,d;
	private Punkte[] punkte = {a = new Punkte("A", 150, 100), (b = new Punkte("B", 250, 100)), 
			(c = new Punkte("C", 250, 200)), (d = new Punkte("D", 150, 200))};
	private JTextField t1, t2, t3; 
	private JLabel l1, l2, l3;
	private JButton button_ein;
	private JTextArea text;
	private Canvas leinwand;

public GeomFormen()
{
	setBackground(Color.lightGray);
	setPreferredSize(dim);
	
	// Label und Textfelder hinzufügen
	l1 = new JLabel("Punkt: ");
	t1 = new JTextField(3);
	this.add(l1);
	this.add(t1);
	
	l2 = new JLabel("X_Pos: ");
	t2 = new JTextField(5);
	this.add(l2);
	this.add(t2);
	
	l3 = new JLabel("Y_Pos: ");
	t3 = new JTextField(5);
	this.add(l3);
	this.add(t3);
	
	button_ein = new JButton("EINGEBEN");
	add(button_ein);
	
	text = new JTextArea("TextArea", 4, 20);
    text.setEditable(true);							// macht das Feld editierbar
    text.setBackground(Color.white);
    text.setLineWrap(true);							// organisiert den Zeilenumbruch
    text.setWrapStyleWord(true);					// bricht nur nach ganzen Wörtern um
    JScrollPane scrollPane = new JScrollPane(text);	// zeigt Scrollbalken, wenn Zeilenanzahl überschritten
    add(scrollPane);
    
    // Leinwand zum Zeichnen der Grafik
    leinwand = new Canvas();
	leinwand.setBounds(30, 320, 300, 300);
	leinwand.setBackground(Color.white);
	add(leinwand);
	
	Graphics g = leinwand.getGraphics();
	g.drawLine(0, 0, 300, 300);
	
	// Panel mit Hintergrundfarbe füllen
	

}

	public void actionPerformed(ActionEvent e){
		Object source = e.getSource();
		if (source == button_ein){
			
		}	
	}

	public void paintComponent (Graphics grafik)
	{
		super.paintComponents(grafik);
		grafik.setColor(getBackground());	
	
		// Panel mit Hintergrundfarbe füllen
		grafik.fillRect (0, 0, getSize().width, getSize().height);
	
		grafik.setColor(Color.black);
		grafik.setFont(f);
			
		FontMetrics fm = grafik.getFontMetrics();
	
		int h = fm.getHeight();
		int br = fm.stringWidth(a.ausgeben());
		System.out.println(b);
	
		grafik.drawString(a.ausgeben(), (a.getX()-br), (a.getY()-5));
		grafik.drawString(b.ausgeben(), b.getX(), (b.getY()- 5));
		grafik.drawString(c.ausgeben(), c.getX(), (c.getY())+h);
		grafik.drawString(d.ausgeben(), d.getX()-br, (d.getY()+h));
	

		for(int i=0; i<punkte.length; i++){
			if(i==punkte.length-1){
				grafik.drawLine(punkte[i].getX(), punkte[i].getY(), 
					punkte[0].getX(), punkte[0].getY());
				break;
			}
			else 
				grafik.drawLine(punkte[i].getX(), punkte[i].getY(), 
						punkte[i+1].getX(), punkte[i+1].getY());	
		}
	}
	public static void main(String[] args)
	{
		FlowLayout fl = new FlowLayout();
		JFrame frame = new JFrame("Geometrische Formen");
		frame.setSize(450, 500);
		frame.setLocationRelativeTo(null);
		Container inhaltsEb = frame.getContentPane();
		GeomFormen p = new GeomFormen();
		inhaltsEb.add(p);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//frame.pack();
		frame.setVisible(true);
	}	
}
```

Könnte mir da jemand weiterhelfen?


----------



## L-ectron-X (10. Feb 2008)

Du verwendest Canvas zusammen mit Swing-Komponenten.
Swing-Komponenten möglichst nicht mit AWT-Komponenten vermischen.
Verwende statt Canvas ein JPanel.

Du speicherst das Graphics-Object: getGraphics();
Auf getGraphics() sollte verzichtet werden, weil das Probleme geben kann. Das Graphics-Object ist nicht besonders langlebig. Stattdessen überschreibst du immer die paint()- bzw. die paintComponent()-Methode der Komponente und zeichnest dort.

Zur NullPointerException kann ich nicht viel sagen, es fehlt noch etwas Code und die genaue Fehlermeldung.


----------



## bliko (10. Feb 2008)

ich habe nun zwei JPanels und möchte sie in einem Frame anordnen, welchen Layout-Manager verwende ich da am besten, für mich kommen meist nur verrückte Anordnungen heraus, die ich einfach noch nicht durchschaue.


----------



## André Uhres (10. Feb 2008)

GeomFormen.java


----------

