JButton(-Listener?)-Error

drummingmichel

Grünschnabel
Hallo Leute!
Ich schreibe ein Paint-Programm.
Die folgende Klasse soll ein Fenster öffnen, indem sich ein JColorChooser befindet.
Das Fenster wird auch geöffnet. Man kann auch mit dem ColorChooser arbeiten (d.h. Farben auswählen usw.).
Beim Drücken des JButtons sollte sich eine Bestimmte Stiftfarbe oder Hintergrundfarbe im Hauptfenster ändern. Doch ich bekomme nur eine error-Meldung (folgend nach der Klasse).

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.colorchooser.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

public class ColorWindow extends JPanel implements ChangeListener {

    protected JColorChooser tcc;
    private ColorWindow neuC; 
    protected JLabel banner;
    private JButton ende;
    public String zweck;
    private PanelEinheit panel;
    private Color farbe;
    private JFrame frame;

    public ColorWindow() {
        super(new BorderLayout());
        // oberes banner erstellen
        banner = new JLabel("...Farbe...", JLabel.CENTER);
        banner.setForeground(Color.WHITE);
        banner.setBackground(Color.BLACK);
        banner.setOpaque(true);
        banner.setFont(new Font("SansSerif", Font.BOLD, 26));
        banner.setPreferredSize(new Dimension(100, 30));

        JPanel bannerPanel = new JPanel(new BorderLayout());
        bannerPanel.add(banner, BorderLayout.CENTER);               // Panel, der banner zeichnet
        bannerPanel.setBorder(BorderFactory.createTitledBorder("Bitte wählen Sie eine..."));

        //Set up color chooser for setting text color
        tcc = new JColorChooser(banner.getForeground());
        tcc.getSelectionModel().addChangeListener(this);
        tcc.setBorder(BorderFactory.createTitledBorder("...und zwar hier:"));

        add(bannerPanel, BorderLayout.PAGE_START);
        add(tcc, BorderLayout.CENTER);
        
        ende = new JButton("Farbe gefunden & gewählt. Jetzt anwenden!");
        ende.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                endeGeklickt(e);
            }
        });
        add(ende, BorderLayout.PAGE_END);
        
        zweck = "a";
        farbe = Color.white;
    }
    
    public void lernePanelKennen(PanelEinheit p){
        this.panel = p;
    }
    
    public Color getFarbe(){return farbe;}
    
    public void endeGeklickt(ActionEvent e){
        if(zweck=="n") {panel.setCN (farbe);}
        if(zweck=="h") {panel.setCH (farbe);}
        if(zweck=="v") {panel.setCV (farbe);}
        if(zweck=="hv"){panel.setCHV(farbe);}
        if(this.zweck=="a") {panel.setCA (farbe);}
        if(this.zweck=="bg"){panel.setBGFarbe(farbe);}
        hide();
    }

    public void stateChanged(ChangeEvent e) {
        farbe = tcc.getColor();
        banner.setForeground(farbe);
    }

    // Soll von verwendender Methode benutzt werden.
    public void create() {
        //rahmen-einstellungen.
        frame = new JFrame("M & M & M  -  ColorWindow");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        neuC = new ColorWindow();
        neuC.setOpaque(true); //content panes must be opaque
        frame.setContentPane(neuC);

        //"letzter schliff"
        frame.pack();
    }
    public void show(){frame.setVisible(true);}   //zeige Fenster
    public void hide(){frame.setVisible(false);}  //verstecke Fenster
    
    public void setzweck(String z) {zweck = z;
                                    neuC.setzweckC(z);}
                                    
    public void setzweckC(String z){zweck = z;}
}

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ColorWindow.endeGeklickt(ColorWindow.java:72)
at ColorWindow$1.actionPerformed(ColorWindow.java:55)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6134)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5899)
at java.awt.Container.processEvent(Container.java:2023)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Container.dispatchEventImpl(Container.java:2081)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
at java.awt.Container.dispatchEventImpl(Container.java:2067)
at java.awt.Window.dispatchEventImpl(Window.java:2458)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Ich bin einer der Neueren auf dem Gebiet. NullPointerException. heißt das nicht, dass ein Objekt, das ich nutze, = null ist?
Ich hoffe jemand kann mir helfen. Ich sitze echt schon Tage an dieser Stelle und hab alles ausprobiert, was ich mir vorstellen kann...

Danke im Vorraus.

Michel
 
Zuletzt bearbeitet von einem Moderator:
Doch, sollte es heißen.
ColorWindow.zweck ist es afaik nicht, da du es im Konstruktor setzt.
Rufst du ColorWindow.lernePanelKennen(PanelEinheit p) auf? (btw. vergleichst du in ColorWindow.endeGeklickt das String-Object sehr ungünstig.)

Außerdem frage ich mich, wozu du die Zugriffsrechte so durcheinander setzt, und warum du manchmal dem this-pointer, größtenteils aber doch nicht verwendest. Schaut meiner Meinung nach sehr durcheinander aus.

(Enthält "JFrame.EXIT_ON_CLOSE" nicht den int, der sagt dass das Programm beim
schließen des Fensters beenden soll? Wäre doch sehr ungünstig, wenn du nicht grade für Microsoft arbeitest.)
 
Hallo,

es liegt daran, dass panel noch null ist. Das Object musst du irgendwo instanzieren.

Zudem wie Kai schon gesagt hat, sind deine Prüfungen, ob die String gleich sind, nicht sehr optimal. In deinem Falle funktioniert es zwar, aber String sollten mit der Methode equals verglichen werden.

Kai008 hat gesagt.:
(Enthält "JFrame.EXIT_ON_CLOSE" nicht den int, der sagt dass das Programm beim
schließen des Fensters beenden soll? Wäre doch sehr ungünstig, wenn du nicht grade für Microsoft arbeitest.)

Diese Aussage verstehe ich nicht.

MFG

Sascha
 
Ups, sorry.
Ich meinte, dass "JFrame.EXIT_ON_CLOSE" den Wert zurückgibt (3, grad nachgeschaut), der setDefaultCloseOperation(int) sagt, dass beim beenden, also wenn das Kreuz rechts oben drückt, das Programm beendet wird. Aber das JFrame, welches er das sagt, ist ja nur die Farbauswahl. d. H. wenn er die Farbauswahl schließt beendet das Programm.
 
Ok, da hast du schon recht.

Hatte gar nicht dran gedacht, dass das JFrame eventuell nur ein Dialog sein soll.

MFG

Sascha
 
Vielen Dank für eure Hilfe Jungs!

Die Methode im Hauptfenster, die die ColorWindow-Methode lernePanelKennen(...) aufruft, wurde gar nicht aufgerufen.
Dieses Problem wäre gelöst.

Danke für den Hinweis mit setDefaultCloseOperation(int)!
der int muss 0 sein. das fenster kann dann gar nicht geschlossen werden.
darf es ja auch nicht. so wie ich es habe wird es ja nur immer wieder sichtbar und unsichtbar gemacht. je nach dem ob es gebraucht wird.

hatte noch ein kleines problem mit der hide() methode.
habs jetzt aber geschafft!

Vielen Dank!
 

Neue Beiträge

Zurück