NullPointerException bei Übergabe eines RadioButtons

Markus_667

Aktives Mitglied
Hallo Zusammen ich habe ein Problem mit einem RadioButton und ich finde einfach keine Lösung.
Kurz zur Problembeschreibung:
Ich erstelle einen JFrame und möchte mir der Maus dort Rechtecke generieren.
Das klappt auch soweit, aber um mehrere verschiedene Objekte mit eine Mausaktion zu erstellen möchte ich in einem zweiten Fenster mit Radio Buttons abfragen was in JFrame generiert werden soll.
Wenn ich das so programmiere wie ich es mir denke bekomme ich aber beim Klicken eine NullPointerException. Ich kann mir aber nicht erklären warum.
Die Exception kommt beim Aufruf der Merhode public boolean getRadioTrans().
Habt ihr vielleicht eine elegantere Lösung als das mit RadioButtons zu lösen ?

Für eure Hilfe wäre ich sehr dankbar.
Folgend mein Code: (Die Klasse GrafikObjekte und alle Imports habe ich weg gelassen, da die hier nicht relevant sind denke ich.)
Java:
public class start {

    public static void main(String[] args) {
        // Optionen Panel wird erstellt und übergeben
        Optionen optionenPanel = new Optionen();
        // Erstellen der Zeichenfläche Window
        ZeichenArea zeichenArea = new ZeichenArea(optionenPanel);
        //Optionen optionenPanel = new Optionen();
    }
}
Java:
public class ZeichenArea {
    JFrame frame;
    GrafikObjekte grafikObj;
    Optionen optionenPanel;

    ZeichenArea() {
        grafikObj = new GrafikObjekte();
        System.out.println("Zeichenbrett Konstruktor");
        frame = new JFrame("Zeichenbrett");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1000, 800);
        frame.add(grafikObj);
        // Hier wird das Objekt GrafikObj Area an den Mouse Handler übergeben.
        AktionHandler aktion_handler = new AktionHandler(grafikObj, optionenPanel);
        grafikObj.addMouseListener(aktion_handler);
        grafikObj.addMouseMotionListener(aktion_handler);
        frame.addKeyListener(aktion_handler);

        frame.setVisible(true);
    }
Java:
public class AktionHandler implements KeyListener, MouseMotionListener, MouseListener {

    Optionen optionenPanel;   
    GrafikObjekte grafikobjekt;

    public AktionHandler(GrafikObjekte array_GrafikObj,Optionen optionenPanel) {
        // Aufruf des Konstruktors durch ZeichenArea
        this.grafikobjekt=array_GrafikObj;
        this.optionenPanel = optionenPanel;
    }
@Override
    public void mouseClicked(MouseEvent e) {
        // Erstellen der Objekte durch auslesen der Maus XY Koordinaten
        // und übergabe an die Methode aus der GrafikObjekt Klasse
        System.out.println(optionenPanel.radioTrans.getHeight());
        //System.out.println(optionenPanel.getRadioTrans());
        if (optionenPanel.getRadioTrans())
        grafikobjekt.addTransition(e.getX(), e.getY());
       
    }
}
    public ZeichenArea(Optionen optionenPanel) {
        this();
        this.optionenPanel = optionenPanel;
    }

    public JFrame getFrame() {
        return frame;
    }

    public void setFrame(JFrame frame) {
        this.frame = frame;
    }

}

Java:
public class Optionen extends JFrame {

    JFrame frame;
    public JRadioButton radioTrans;

    public Optionen() {
        frame = new JFrame("Optionen");
        frame.setSize(300, 300);
        this.setTitle("Optionen auswählen");
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        // Hier wird ein JRadioButton erstellt
        radioTrans = new JRadioButton("Transition", true);
        System.out.println("radio Konstruktor " + radioTrans.isSelected());
        // JRadioButton wird dem Panel hinzugefügt
        frame.add(radioTrans);
        frame.setVisible(true);
    }

    public boolean getRadioTrans() {
        System.out.println("RadioButton" + radioTrans.isSelected());
        return radioTrans.isSelected();
    }
}


Vielen Dank schon mal im voraus für eure Zeit...
 
Du hast derzeit als Konstruktor
Java:
ZeichenArea(){
...
}
anstelle von
Java:
ZeichenArea(Optionen optionenPanel){
...
}
 
Hallo also dein Code ist ein bisschen durcheinander gekommen aber ein Fehler den ich erkennen kann ist:

Java:
public class ZeichenArea {
    [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+jframe']JFrame[/URL] frame;
    GrafikObjekte grafikObj;
    Optionen optionenPanel;

    ZeichenArea() {
        grafikObj = new GrafikObjekte();
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println("Zeichenbrett Konstruktor");
        frame = new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+jframe']JFrame[/URL]("Zeichenbrett");
        frame.setDefaultCloseOperation([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+jframe']JFrame[/URL].EXIT_ON_CLOSE);
        frame.setSize(1000, 800);
        frame.add(grafikObj);
        // Hier wird das Objekt GrafikObj Area an den Mouse Handler übergeben.
        AktionHandler aktion_handler = new AktionHandler(grafikObj, optionenPanel); <----
        grafikObj.addMouseListener(aktion_handler);
        grafikObj.addMouseMotionListener(aktion_handler);
        frame.addKeyListener(aktion_handler);

        frame.setVisible(true);
    }
 
    public ZeichenArea(Optionen optionenPanel) {
        this(); // Hier rufst du den Konstruktur ohne Parameter auf und verwendest ein leeren optionenPanel beim AktionHandler
        this.optionenPanel = optionenPanel;
    }

    public JFrame getFrame() {
        return frame;
    }

    public void setFrame(JFrame frame) {
        this.frame = frame;
    }
}

Das der AktionHandler aktion_handler = new AktionHandler(grafikObj, optionenPanel) ein null (optionenPanel) bekommt, da du den erst nach dem Aufruf von this() setzt.

Grüße
 
Ja manchmal sieht man den Wald vor lauter Bäumen nicht....
Jetzt hab ich den Konstruktor geändert und jetzt passt das auch.

Vielen Dank dafür.... der Tag ist gerettet...
 
Aber jetzt taucht der RadioButton auch auf der Zeichenfläche auf...Obwohl ich nur in der Optionen Klasse den Button in das Frame hinzufüge mit frame.add(radioTrans)...

Wenn ich allerdings das Zeichenfläche Fenster etwas verschieben passiert das manchmal nicht, es ist also ein sporadischer Fehler.... wie bekomme ich das jetzt wieder gelöst ?
 
Du hast da irgendwie sehr viele Frames im Spiel. z.B. ist "Optionen" selber ein JFrame, erzeugt aber noch einen JFrame ... und weiter oben war nochmal ein JFrame ??
 
Hallo nochmal ich war beruflich unterwegs.... daher hat es etwas gedauert.

@JStein52
Ja da hast du recht, ich hab meinen Code etwas bereinigt, würdest du Ihn dir bitte noch einmal anschauen ?
Ich bekomme den Radio Button nicht von der ZeichanArea weg.... Wenn ich klicke wird ein Viereck gezeichnet und der RadioButton taucht auf.
Hab schon alles probiert aber hat nichts geholfen bis dahin.

Danke schonmal
Java:
package ObjekteKlasse2;

public class start {

    public static void main(String[] args) {
        // Optionen Panel wird erstellt und übergeben
        Optionen optionenPanel = new Optionen();
        // Erstellen der Zeichenfläche Window
        ZeichenArea zeichenArea = new ZeichenArea(optionenPanel);
        //das Optionen Panel soll als letztes angezeigt werden
        optionenPanel.anzeigen();
    }
}

Java:
package ObjekteKlasse2;

public class ZeichenArea {
    JFrame frame;
    GrafikObjekte grafikObj;
    Optionen optionenPanel;

    public ZeichenArea(Optionen optionenPanel) {
        grafikObj = new GrafikObjekte();
        System.out.println("Zeichenbrett Konstruktor");
        frame = new JFrame("Zeichenbrett");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1000, 800);
        frame.add(grafikObj);
        // Hier wird das Objekt GrafikObj Area an den Mouse Handler übergeben.
        AktionHandler aktion_handler = new AktionHandler(grafikObj, optionenPanel);
        grafikObj.addMouseListener(aktion_handler);
        grafikObj.addMouseMotionListener(aktion_handler);
        frame.addKeyListener(aktion_handler);
       
        frame.setVisible(true);
    }

    public JFrame getFrame() {
        return frame;
    }

    public void setFrame(JFrame frame) {
        this.frame = frame;
    }

}

Java:
package ObjekteKlasse2;
public class AktionHandler implements KeyListener, MouseMotionListener, MouseListener {

    Optionen optionenPanel;   
    GrafikObjekte grafikobjekt;

    public AktionHandler(GrafikObjekte array_GrafikObj,Optionen optionenPanel) {
        // Aufruf des Konstruktors durch ZeichenArea
        this.grafikobjekt = array_GrafikObj;
        this.optionenPanel = optionenPanel;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // Erstellen der Objekte durch auslesen der Maus XY Koordinaten
        // und übergabe an die Methode aus der GrafikObjekt Klasse
        if (optionenPanel.getRadioTrans() == true)
        grafikobjekt.addTransition(e.getX(), e.getY());       
    }

}

Java:
package ObjekteKlasse2;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.JPanel;

public class GrafikObjekte extends JPanel {

    // Folgend werden alle Array Listen deklsariert
    public ArrayList<Rectangle2D> transitionen;
    private ArrayList<Ellipse2D> stellen;
    private ArrayList<Line2D> kanten;
    // Variable für die Groesse der Transitionen und Stellen
    Double hoeheRect = 30.0, breiteRect = 30.0;
    Double hoeheElli = 30.0, breiteElli = 30.0;

    public GrafikObjekte() {
        System.out.println("Konstruktor GrafikObj");
        transitionen = new ArrayList<Rectangle2D>();
        stellen = new ArrayList<Ellipse2D>();
        kanten = new ArrayList<Line2D>();
    }

    // Hier werden die Transitionen behandelt
    public void addTransition(double x, double y) {
        transitionen.add(new Rectangle2D.Double(x-(breiteRect/2), y-(hoeheRect/2),breiteRect,hoeheRect));
        System.out.println("add transition");
        repaint();
    }
    // Hier werden die Stellen Behandelt
    public void addStelle(double x, double y) {
        stellen.add(new Ellipse2D.Double(x, y, hoeheRect, breiteRect));
    }

    //Paint Component Methode
    protected void paintComponent(Graphics g) {
        System.out.println("rePaint");
        // super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        for (int size = 0; size < transitionen.size(); size++) {
            System.out.println("schleife");
            g2d.draw(transitionen.get(size));
        }
    }
}

Java:
package ObjekteKlasse2;

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class Optionen extends JFrame {

    JFrame frameOption;
    public JRadioButton radioTrans;

    public Optionen() {
        //frameOption = new JFrame("Optionen");
        //frameOption.setSize(300, 300);
        this.setSize(300, 300);
        this.setTitle("Optionen auswählen");
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        // Hier wird ein JRadioButton erstellt
        radioTrans = new JRadioButton("Transition", true);
        System.out.println("radio Konstruktor " + radioTrans.isSelected());
        // JRadioButton wird dem Frame hinzugefügt
        this.add(radioTrans);
        //frameOption.add(radioTrans);
        //frameOption.setVisible(true);
    }

    public boolean getRadioTrans() {
        System.out.println("RadioButton " + radioTrans.isSelected());
        return radioTrans.isSelected();
    }
   
    public void anzeigen() {
        this.setVisible(true);
    }
}
 
JStein52 war Sonntag zuletzt eingeloggt.

Dein Programm kompiliert nicht. Es wird angezeigt:
"The type AktionHandler must implement the inherited abstract method KeyListener.keyPressed(KeyEvent)"

Insgesamt fehlen:
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)

Diese Methoden müssen auf jeden Fall vorhanden sein. Der Rumpf darf aber leer sein. Beispiel:
Java:
    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

Aber zurück zum Thema:
Dir fehlt wahrscheinlich irgendwo ein repaint() oder ein revalidate(). Wenn man das Fenster maximiert verschwindet der GeisterButton nämlich.
 
Zuletzt bearbeitet:
Sorry das hatte ich vergessen zu erwähnen, ich hab alle Methoden die nicht benutzt werden aufgrund der besseren Lesbarkeit weg gelassen. (wie mouseEntered.... usw)

Das Programm kompiliert ohne Fehler...

Stimmt, mir ist noch gar nicht aufgefallen dass der Button beim Maximieren verschwindet.
Ich füge Ihn ja auch nicht zu diesem Panel hinzu, aber er taucht doch immer wieder auf.

Das revalidate() vor dem repaint() bringt leider auch keine Änderung.

Hast du noch einen Vorschlag woran das liegen könnte ?
 
Ich habe es geschafft.
Du musst in folgender Zeile die beiden Schrägstriche wegmachen:
Java:
// super.paintComponent(g);
 
Geil... Problem gelöst... das ist ja auch völlig logisch.
Ich muss es wohl mal bei einer Fehlersuche weg gemacht haben und nicht wieder gesetzt.

Super vielen vielen Dank für dein Hilfe.
 

Neue Themen


Zurück
Oben