setLookAndFeel() дает NullPointerException, если я использую JTable

У меня есть JFrame с двумя панелями. И я устанавливаю UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) в классе, который расширяется JFrame. Так что он отлично работает для обеих панелей, если я не JTable в этом. Но если я добавлю JTable к любой панели, то переход к этой панели дает мне NullPointerException как ниже.

Так в чем здесь проблема, мне нужно что-то установить для JTable также

РЕДАКТИРОВАТЬ: я понял, что проблема не с JTable, а с tableCellRenderer. Я добавляю tableRenderer, как показано ниже

public class Frame extends JFrame
{
public void initialize()
{
    try
    {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e)
    {
        e.printStackTrace();
    }

    JPanel panel1 = new JPanel();
    panel1.add(new JLabel("Panel1"));
    JPanel panel2 = new JPanel();
    JTable table = new JTable(2,2);
    table.getColumnModel().getColumn(1).setCellRenderer(new CheckBoxRenderer()); // Adding this renderer creates me problem
    JScrollPane jScrollPane = new JScrollPane(table);
    jScrollPane.setSize(100, 100);
    panel2.add(jScrollPane);
    JTabbedPane tabbedPane = new JTabbedPane();
    tabbedPane.addTab("Panel1", panel1);
    tabbedPane.addTab("Panel2", panel2);
    add(tabbedPane);
    setSize(400, 400);
    setVisible(true);
}

class CheckBoxRenderer implements TableCellRenderer
{
    JCheckBox   check   = new JCheckBox();

    public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column)
    {
        if (row != 0 && obj instanceof Boolean)
        {
            check.setSelected((Boolean) obj);
            return check;
        }
        return null;
    }
}

public static void main(String[] args)
{
    Frame frame = new Frame();
    frame.initialize();
}

 }

Так что это дает мне NullPointerException. И если я удаляю строку setCellRenderer, она работает нормально. Кто-нибудь может мне помочь

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:685)
at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
at javax.swing.JComponent.paintComponent(JComponent.java:779)
at javax.swing.JComponent.paint(JComponent.java:1055)
at javax.swing.JComponent.paintChildren(JComponent.java:888)
at javax.swing.JComponent.paint(JComponent.java:1064)
at javax.swing.JViewport.paint(JViewport.java:731)
at javax.swing.JComponent.paintChildren(JComponent.java:888)
at javax.swing.JComponent.paint(JComponent.java:1064)
at javax.swing.JComponent.paintChildren(JComponent.java:888)
at javax.swing.JComponent.paint(JComponent.java:1064)
at javax.swing.JComponent.paintChildren(JComponent.java:888)
at javax.swing.JComponent.paint(JComponent.java:1064)
at javax.swing.JComponent.paintChildren(JComponent.java:888)
at javax.swing.JComponent.paint(JComponent.java:1064)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5232)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
at javax.swing.RepaintManager.paint(RepaintManager.java:1249)
at javax.swing.JComponent._paintImmediately(JComponent.java:5180)
at javax.swing.JComponent.paintImmediately(JComponent.java:4991)
at javax.swing.RepaintManager$3.run(RepaintManager.java:808)
at javax.swing.RepaintManager$3.run(RepaintManager.java:796)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:769)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:718)
at javax.swing.RepaintManager.access$1100(RepaintManager.java:62)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1677)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:745)
at java.awt.EventQueue.access$300(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:706)
at java.awt.EventQueue$3.run(EventQueue.java:704)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:715)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

РЕДАКТИРОВАТЬ 2: При поиске в Google я нашел это /questions/23388271/nullpointerexception-v-javaxswingplafsynthsynthcontextgetpainter.

И если я сделаю UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); который отлично работает Но я использую Ubuntu OS, поэтому мне нужно посмотреть GTK. Так я и сделал UIManager.setLookAndFeel("ccom.sun.java.swing.plaf.gtk.GTKLookAndFeel"); но это снова дает мне исключение. Я не могу понять, что здесь не так. Я узнал об этих пакетах из фактической реализации getSystemLookAndFeelClassName()

2 ответа

Решение

Этот код работает нормально для меня сейчас

class CheckBoxRenderer implements TableCellRenderer
{
    JCheckBox   check   = new JCheckBox();

    @Override
    public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column)
    {
        if (row != 0 && obj instanceof Boolean)
        {
            check.setSelected((Boolean) obj);
        }
//      return null; this line gives NullPointerException
        return check;
    }
}

Наконец-то я разобрался с проблемой. Проблема с вышеуказанной линией return null, возврате null дает NullPointerException, Потому что, если мы увидим реализацию

private void paintCell(SynthContext context, Graphics g, Rectangle cellRect, int row, int column) из SynthTableUI.class у него есть строка как

Color b = component.getBackground(); а потому что я возвращаюсь nullпытается получить background из null, Вот в чем проблема. Спасибо за вашу помощь

Ваш вопрос пропускает несколько полезных сведений, таких как: версия JVM, операционная система...

Я сталкивался с подобной проблемой в прошлом, и она была связана с ошибкой этой конкретной версии JVM, поэтому вы обновились до последней версии JVM?

Посмотрите на этот пост.

Я предполагаю, что ваш JTable не настроен ни на что и никакой обработчик событий не присутствует на этом...

Другие вопросы по тегам