Hi,
zum 2. mal jetzt hab ich dieses Problem. Kann den Fehler einfach nicht finden.. kompilieren geht, aber ausführen nicht. Der Fehler tritt in Zeile 117 auf in der paintComponent Methode des Panels, in das ich zeichnen möchte.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at CJPanel.paintComponent(CGrafik.java:117)
.......
Hoffe es kann mir jemand helfen...
zum 2. mal jetzt hab ich dieses Problem. Kann den Fehler einfach nicht finden.. kompilieren geht, aber ausführen nicht. Der Fehler tritt in Zeile 117 auf in der paintComponent Methode des Panels, in das ich zeichnen möchte.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at CJPanel.paintComponent(CGrafik.java:117)
.......
Code:
//dieses Programm zeigt unter Verwendung der Panel Komponente das Zeichnen von
//verschiedenen Figuren mit Hilfe von Optionsfeldern
import javax.swing.*; //Swing-Komponenten
import java.awt.*; //der Layout-Manager
import java.awt.event.*; //die Ereignisbehandlung
//die Hauptklasse
public class CGrafik {
public static void main(String[] args){
CFenster fenster = new CFenster("Zeichnen");
fenster.pack();
fenster.setSize(450,350);
fenster.setResizable(true);
fenster.setVisible(true);
}
}
//Die Klasse des Fensters
class CFenster extends JFrame {
ButtonGroup knopfgruppe;
//der Konstruktor
CFenster (String titel) {
//ruft zunächst den Konstruktor der Basisklasse auf
super(titel);
//ein Layout-Manager für das Fenster wird angelegt
setLayout(new FlowLayout());
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//ein neues Panel für die Zeichenfläche
CJPanel panel = new CJPanel(knopfgruppe);
add(panel);
//ein Panel für die RadioButtons
JPanel knopfpanel = new JPanel();
add(knopfpanel);
//Die Buttons werden erstellt
JRadioButton knopf1 = new JRadioButton("Kreis",false);
JRadioButton knopf2 = new JRadioButton("Scheibe",false);
JRadioButton knopf3 = new JRadioButton("Rechteck",false);
//Befehlsnamen für Ereignisbehandlung festelegen
//der Einfachheit halber = dem Buttonnamen
knopf1.setActionCommand("Kreis");
knopf2.setActionCommand("Scheibe");
knopf3.setActionCommand("Rechteck");
//erstellen einer ButtonGroup um mit den RadioButtons umgehen zu können
//liefert Methoden die die selektierten Buttons zurückgeben, bewirkt
//ausserdem, dass nur 1 Knopf der Gruppe selektiert werden kann
knopfgruppe = new ButtonGroup();
//dem Panel hinzugefügt
knopfpanel.add(knopf1);
knopfpanel.add(knopf2);
knopfpanel.add(knopf3);
//die Buttons der ButtonGruppe hinzufügen
knopfgruppe.add(knopf1);
knopfgruppe.add(knopf2);
knopfgruppe.add(knopf3);
knopfpanel.setLayout(new GridLayout(3,1,20,20));
knopfpanel.setBorder(BorderFactory.createEtchedBorder(1));
knopfpanel.setBorder(BorderFactory.createTitledBorder("Form"));
}
}
class CJPanel extends JPanel{
int mx, my; //Mauskoordinaten
ButtonGroup knopfgruppe;
CJPanel (ButtonGroup kgruppe) {
knopfgruppe = kgruppe;
//dem Panel wird ein Listener zur Ereignisbehandlung zugewiesen
addMouseListener(new CMausListener());
}
public Dimension getMinimumSize() {
return new Dimension(300,300);
}
public Dimension getPreferredSize() {
return getMinimumSize();
}
//der MausListener zur Ereignisbehandlung des Panels
//wird natürlich im Panel an sich definiert, da er ja auch zu diesem gehört
class CMausListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
//die aktuelle Position der Maus merken
mx = e.getX();
my = e.getY();
}
}
//in dieser Methode wird gezeichnet!
public void paintComponent(Graphics g) {
//Aufruf des Super-Konstruktors bei paintComponent ein MUSS
super.paintComponent(g);
//Festlegen der Hintergrundfarbe
setBackground(Color.black);
String befehlsname; //String zum Überprüfen des ActionCommands
ButtonModel aktuell = null; //ButtonModel des ausgewählten Knopfes
//welcher Knopf ist ausgewählt? -> gibt das ButtonModel
aktuell = knopfgruppe.getSelection(); // HIER TRITT DER FEHLER AUF
//durch das ButtonModel lässt sich der Befehlsname des Knopfes erfragen
//und somit seine Identität feststellen
befehlsname = aktuell.getActionCommand();
//entsprechend reagieren
if (aktuell == null)
return;
//grüne Farbe zum zeichnen
g.setColor(Color.green);
if(befehlsname.equals("Kreis"))
g.drawOval(mx,my,40,40);
if(befehlsname.equals("Scheibe"))
g.fillOval(mx,my,40,40);
if(befehlsname.equals("Rechteck"))
g.drawRect(mx,my,40,40);
}
}
Hoffe es kann mir jemand helfen...