Moin. Ich mache gerade ein Youtube-Tutorial nach und obwohl wie ich meine ich alles genauso nachgemacht habe, wirft bei mir das Programm eine NullPointerException, wenn ich in dem erzeugten Fenster einen anderen Radioknopf drücke. Hier ist der Quelltext der GUI-Klasse (die main-Klasse erzeugt nur das Fenster, setzt die Schließungsoperation und Größe und macht es sichtbar):
Der Debugger in eclipse markiert dabei die Stelle txt1.setFont(font); grün, aber ich sehe da den Fehler nicht. font wird doch bei jedem Handler-Objekt-Erzeugen vom Konstruktor initialisiert und beim Aufruf der Methode sollte es das Textfeld txt1 aus der umhüllenden Klasse entsprechend ändern. Wo ist das Problem? Hier die Fehler:
Java:
package JRadioButton;
// JRadioButton: so aehnlich wie JCheckBox, aber man kann nur
// einen gleichzeitig auswaehlen (wie in alten Autoradios)
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class GUI extends JFrame
{
private JTextField txt1;
private Font plainfont;
private Font boldfont;
private Font italicfont;
private Font bolditalicfont;
private JRadioButton plainbutton;
private JRadioButton boldbutton;
private JRadioButton italicbutton;
private JRadioButton bolditalicbutton;
private ButtonGroup knopfgruppe;
public GUI()
{
super("Tolles Programm v0.1");
setLayout(new FlowLayout());
JTextField txt1 = new JTextField("Eingabetext", 20);
add(txt1);
plainbutton = new JRadioButton("plain", true); //nur einer kann true sein
boldbutton = new JRadioButton("bold", false);
italicbutton = new JRadioButton("italic", false);
bolditalicbutton = new JRadioButton("bold + italic", false);
add(plainbutton);
add(boldbutton);
add(italicbutton);
add(bolditalicbutton);
knopfgruppe = new ButtonGroup();
knopfgruppe.add(plainbutton);
knopfgruppe.add(boldbutton);
knopfgruppe.add(italicbutton);
knopfgruppe.add(bolditalicbutton);
plainfont = new Font("Serif", Font.PLAIN, 14);
boldfont = new Font("Serif", Font.BOLD, 14);
italicfont = new Font("Serif", Font.ITALIC, 14);
bolditalicfont = new Font("Serif", Font.BOLD + Font.ITALIC, 14);
txt1.setFont(plainfont);
plainbutton.addItemListener(new HandlerClass(plainfont));
boldbutton.addItemListener(new HandlerClass(boldfont));
italicbutton.addItemListener(new HandlerClass(italicfont));
bolditalicbutton.addItemListener(new HandlerClass(bolditalicfont));
}
private class HandlerClass implements ItemListener
{
private Font font;
public HandlerClass(Font fontarg)
{
font = fontarg;
}
@Override
public void itemStateChanged(ItemEvent event)
{
txt1.setFont(font);
}
}
}
Der Debugger in eclipse markiert dabei die Stelle txt1.setFont(font); grün, aber ich sehe da den Fehler nicht. font wird doch bei jedem Handler-Objekt-Erzeugen vom Konstruktor initialisiert und beim Aufruf der Methode sollte es das Textfeld txt1 aus der umhüllenden Klasse entsprechend ändern. Wo ist das Problem? Hier die Fehler:
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at JRadioButton.GUI$HandlerClass.itemStateChanged(GUI.java:75)
at javax.swing.AbstractButton.fireItemStateChanged(AbstractButton.java:2056)
at javax.swing.AbstractButton$Handler.itemStateChanged(AbstractButton.java:2358)
at javax.swing.DefaultButtonModel.fireItemStateChanged(DefaultButtonModel.java:440)
at javax.swing.JToggleButton$ToggleButtonModel.setSelected(JToggleButton.java:255)
at javax.swing.ButtonGroup.setSelected(ButtonGroup.java:145)
at javax.swing.JToggleButton$ToggleButtonModel.setSelected(JToggleButton.java:237)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:272)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6414)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
at java.awt.Component.processEvent(Component.java:6179)
at java.awt.Container.processEvent(Container.java:2084)
at java.awt.Component.dispatchEventImpl(Component.java:4776)
at java.awt.Container.dispatchEventImpl(Container.java:2142)
at java.awt.Component.dispatchEvent(Component.java:4604)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4279)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4209)
at java.awt.Container.dispatchEventImpl(Container.java:2128)
at java.awt.Window.dispatchEventImpl(Window.java:2492)
at java.awt.Component.dispatchEvent(Component.java:4604)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:717)
at java.awt.EventQueue.access$400(EventQueue.java:82)
at java.awt.EventQueue$2.run(EventQueue.java:676)
at java.awt.EventQueue$2.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:690)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:687)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Zuletzt bearbeitet: