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:
Könnte mir da jemand weiterhelfen?
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:
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?