NullPointerException on PLAF change to Motif

那年仲夏 提交于 2019-12-12 00:56:50

问题


Can anybody see what I have done to cause the NullPointerException (stack trace below)?

The panel appears OK:

Textual output

os.name:    Windows Vista
os.version:     6.1
java.version:   1.6.0
java.vm.version:    1.6.0-b105
java.vendor:    Sun Microsystems Inc.

That (1.6.0-b105) is ancient, it is the default run time environment of Netbeans here. Must update to a version 7 JRE.

Code

import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
import javax.swing.GroupLayout.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.EmptyBorder;

class GroupLayoutHelper {

    /**
     * Provides a JPanel with two columns (labels & fields) laid out using
     * GroupLayout. The arrays must be of equal size.
     *
     * @param labels The first column contains labels.
     * @param fields The last column contains fields.
     * @param addMnemonics Add mnemonic by next available letter in label text.
     * @return JComponent A JPanel with two columns of the components provided.
     */
    public static JComponent getTwoColumnLayout(
            JLabel[] labels,
            JComponent[] fields,
            boolean addMnemonics) {
        JComponent panel = new JPanel();
        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);
        // Turn on automatically adding gaps between components
        layout.setAutoCreateGaps(true);
        // Create a sequential group for the horizontal axis.
        GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
        Group yLabelGroup = layout.createParallelGroup(Alignment.TRAILING);
        hGroup.addGroup(yLabelGroup);
        Group yFieldGroup = layout.createParallelGroup();
        hGroup.addGroup(yFieldGroup);
        layout.setHorizontalGroup(hGroup);
        // Create a sequential group for the vertical axis.
        GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
        layout.setVerticalGroup(vGroup);

        int p = GroupLayout.PREFERRED_SIZE;
        // add the components to the groups
        for (JLabel label : labels) {
            yLabelGroup.addComponent(label);
        }
        for (Component field : fields) {
            yFieldGroup.addComponent(field, p, p, p);
        }
        for (int ii = 0; ii < labels.length; ii++) {
            vGroup.addGroup(layout.createParallelGroup().
                    addComponent(labels[ii]).
                    addComponent(fields[ii], p, p, p));
        }

        if (addMnemonics) {
            Map<Character, Object> m = new HashMap<Character, Object>();
            for (int ii = 0; ii < labels.length; ii++) {
                labels[ii].setLabelFor(fields[ii]);
                String lwr = labels[ii].getText().toLowerCase();
                for (int jj = 0; jj < lwr.length(); jj++) {
                    char ch = lwr.charAt(jj);
                    if (m.get(ch) == null) {
                        m.put(ch, ch);
                        labels[ii].setDisplayedMnemonic(ch);
                        break;
                    }
                }
            }
        }

        return panel;
    }

    /**
     * Provides a JPanel with two columns (labels & fields) laid out using
     * GroupLayout. The arrays must be of equal size.
     *
     * @param labelStrings Strings that will be used for labels.
     * @param fields The corresponding fields.
     * @return JComponent A JPanel with two columns of the components provided.
     */
    public static JComponent getTwoColumnLayout(
            String[] labelStrings,
            JComponent[] fields) {
        JLabel[] labels = new JLabel[labelStrings.length];
        for (int ii = 0; ii < labels.length; ii++) {
            labels[ii] = new JLabel(labelStrings[ii]);
        }
        return getTwoColumnLayout(labels, fields);
    }

    /**
     * Provides a JPanel with two columns (labels & fields) laid out using
     * GroupLayout. The arrays must be of equal size.
     *
     * @param labels The first column contains labels.
     * @param fields The last column contains fields.
     * @return JComponent A JPanel with two columns of the components provided.
     */
    public static JComponent getTwoColumnLayout(
            JLabel[] labels,
            JComponent[] fields) {
        return getTwoColumnLayout(labels, fields, true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                final JComboBox plafCombo = new JComboBox(
                        UIManager.getInstalledLookAndFeels());
                plafCombo.setRenderer(new DefaultListCellRenderer() {

                    @Override
                    public Component getListCellRendererComponent(
                            JList list,
                            Object value,
                            int index,
                            boolean isSelected,
                            boolean cellHasFocus) {
                        Component c = super.getListCellRendererComponent(
                                list, value, index, isSelected, cellHasFocus);
                        if (c instanceof JLabel) {
                            JLabel l = (JLabel) c;
                            String s = value.toString();
                            s = s.substring(
                                    s.lastIndexOf(".") + 1, s.length() - 12);
                            l.setText(s);
                            return l;
                        }
                        return c;
                    }
                });
                plafCombo.addItemListener(new ItemListener() {

                    @Override
                    public void itemStateChanged(ItemEvent e) {
                        Object o = plafCombo.getSelectedItem();
                        LookAndFeelInfo plafi = (LookAndFeelInfo) o;
                        try {
                            UIManager.setLookAndFeel(plafi.getClassName());
                            Container c = plafCombo.getTopLevelAncestor();
                            SwingUtilities.updateComponentTreeUI(c);
                            if (c instanceof Window) {
                                Window w = (Window) c;
                                w.pack();
                            }
                        } catch (Exception ignoreAndContinue) {
                        }
                    }
                });
                String longText = getProperty("os.name") +
                        getProperty("os.version") +
                        getProperty("java.version") +
                        getProperty("java.vm.version") +
                        getProperty("java.vendor") +
                        "";
                JComponent[] c = {
                    new JTextField(5),
                    new JTextField(20),
                    plafCombo,
                    new JPasswordField(8),
                    new JScrollPane(new JTextArea(longText, 5, 38))
                };

                String[] ls = {"ID", "Name", "Look & Feel", "Password", "Postcript"};
                JLabel[] l = new JLabel[ls.length];
                JComponent gui = getTwoColumnLayout(ls, c);

                gui.setBorder(new EmptyBorder(4, 8, 4, 8));

                JFrame f = new JFrame("Groupie");
                f.add(gui);
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See http://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };

        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }

    public static String getProperty(String name) {
        return name + ": \t" + 
                System.getProperty(name) + 
                System.getProperty("line.separator");
    }
}

Stack trace

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.plaf.basic.BasicComboBoxUI.selectNextPossibleValue(BasicComboBoxUI.java:1072)
    at javax.swing.plaf.basic.BasicComboBoxUI$Actions.actionPerformed(BasicComboBoxUI.java:1450)
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2844)
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2890)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2807)
    at javax.swing.JComboBox.processKeyEvent(JComboBox.java:1399)
    at java.awt.Component.processEvent(Component.java:5815)
    at java.awt.Container.processEvent(Container.java:2058)
    at java.awt.Component.dispatchEventImpl(Component.java:4410)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
    at java.awt.Component.dispatchEventImpl(Component.java:4282)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Window.dispatchEventImpl(Window.java:2429)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.plaf.basic.BasicComboBoxUI.selectNextPossibleValue(BasicComboBoxUI.java:1072)
    at javax.swing.plaf.basic.BasicComboBoxUI$Actions.actionPerformed(BasicComboBoxUI.java:1432)
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2844)
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2890)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2807)
    at javax.swing.JComboBox.processKeyEvent(JComboBox.java:1399)
    at java.awt.Component.processEvent(Component.java:5815)
    at java.awt.Container.processEvent(Container.java:2058)
    at java.awt.Component.dispatchEventImpl(Component.java:4410)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
    at java.awt.Component.dispatchEventImpl(Component.java:4282)
    at java.awt.Container.dispatchEventImpl(Container.java:2116)
    at java.awt.Window.dispatchEventImpl(Window.java:2429)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

回答1:


  • I added Swing Timer 30times all L&Fs, on 1sec. period, no issue,

Win8 (64b enterprise)

  • jdk1.6.0_22

  • jdk1.7.0_11


WinXP

  • jdk1.6.0_22


Win7 (64b enterprise)

  • jdk1.7.0_11 (notice rendering, resp. refresh is too lazy cann't be useded 1sec period for SwingTimer)

  • jdk1.6.0_22 (no issue with rendering after L&F is switched, don't understand, JDK7 tested three times with JDK6 both windows on the same time, phaaa I need to install last JDK7(don't know version) :-)

  • jdk1.7.0_21 no issue with rendering, resp. the same as for another JDKs on another WinOS version, strange this jdk1.7.0_11, problem is still there, reproducible, how much I hate Win7, Swing, L&F compiled on jdk1.7.0_11



回答2:


This error is caused when you use your arrow keys to change a value of the JComboBox.

I have this error to and I have no idea on how to fix.

The best shot is what I believe to set the JComboBox to its default state and then change the LAF.



来源:https://stackoverflow.com/questions/16233512/nullpointerexception-on-plaf-change-to-motif

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!