簡體   English   中英

Java JFileChooser在Metal L&F中導致NullPointerException

[英]Java JFileChooser causes NullPointerException in Metal L&F

我在用Java顯示JFileChooser遇到問題。 當我嘗試以任何方式顯示對話框時,都會收到NullPointerException。 由於我正在從事一個相當復雜的Java項目,因此最初我以為我的代碼有問題,所以我寫了一個我能想到的最簡單的Swing項目:

package info.varden.so;

import javax.swing.JFileChooser;
import javax.swing.JFrame;

public class MetalFileChooserTest {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        JFileChooser jfc = new JFileChooser();
        System.out.println("All well so far!");
        int result = jfc.showSaveDialog(frame);
    }

}

即使這樣,我仍然有例外。 內容如下:

Exception in thread "main" java.lang.NullPointerException
    at javax.swing.plaf.metal.MetalFileChooserUI$IndentIcon.getIconWidth(MetalFileChooserUI.java:892)
    at javax.swing.SwingUtilities.layoutCompoundLabelImpl(SwingUtilities.java:943)
    at javax.swing.SwingUtilities.layoutCompoundLabel(SwingUtilities.java:870)
    at javax.swing.plaf.basic.BasicLabelUI.layoutCL(BasicLabelUI.java:76)
    at javax.swing.plaf.basic.BasicLabelUI.getPreferredSize(BasicLabelUI.java:221)
    at javax.swing.JComponent.getPreferredSize(JComponent.java:1642)
    at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1346)
    at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1294)
    at javax.swing.plaf.basic.BasicListUI$Handler.valueChanged(BasicListUI.java:2611)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:147)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:194)
    at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:388)
    at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:398)
    at javax.swing.DefaultListSelectionModel.setSelectionInterval(DefaultListSelectionModel.java:442)
    at javax.swing.JList.setSelectedIndex(JList.java:2179)
    at javax.swing.plaf.basic.BasicComboPopup.setListSelection(BasicComboPopup.java:1127)
    at javax.swing.plaf.basic.BasicComboPopup.access$300(BasicComboPopup.java:46)
    at javax.swing.plaf.basic.BasicComboPopup$Handler.itemStateChanged(BasicComboPopup.java:965)
    at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1205)
    at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1262)
    at javax.swing.JComboBox.contentsChanged(JComboBox.java:1309)
    at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:100)
    at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.setSelectedItem(MetalFileChooserUI.java:1015)
    at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.addItem(MetalFileChooserUI.java:986)
    at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.access$900(MetalFileChooserUI.java:911)
    at javax.swing.plaf.metal.MetalFileChooserUI.doDirectoryChanged(MetalFileChooserUI.java:659)
    at javax.swing.plaf.metal.MetalFileChooserUI.access$1200(MetalFileChooserUI.java:33)
    at javax.swing.plaf.metal.MetalFileChooserUI$5.propertyChange(MetalFileChooserUI.java:748)
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
    at java.awt.Component.firePropertyChange(Component.java:8170)
    at javax.swing.JFileChooser.setCurrentDirectory(JFileChooser.java:568)
    at javax.swing.JFileChooser.<init>(JFileChooser.java:334)
    at javax.swing.JFileChooser.<init>(JFileChooser.java:286)
    at info.varden.so.MetalFileChooserTest.main(MetalFileChooserTest.java:12)

字符串“到目前為止一切順利!” 也不會打印到控制台,這顯然是因為構造函數導致崩潰。 我顯然經過了一些測試,發現只能在Metal外觀上重現此效果。 運行Nimbus效果很好。 我正在針對Java 6(JDK 1.6.0_45)的NetBeans IDE 8.0中進行開發,除JDK 1.7.0_55外還安裝了該JDK。 我還嘗試將構造函數切換為以String路徑為參數的構造函數,但無濟於事。 據我所知,似乎沒有其他人遇到這個問題。

我現在想知道是什么原因導致這種行為,以及如何解決? 一個簡單的解決方案是切換到Nimbus外觀(有效),但是我的某些最終用戶可能在其系統上沒有該外觀。 還有其他方法,還是僅僅是Java錯誤?

任何幫助將不勝感激。

看起來這僅發生在Linux中嗎? 有一種解決方法。

LookAndFeel lookAndFeelBackup = UIManager.getLookAndFeel();
try {

  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
// put your filechooser here
JFileChooser jfc = new JFileChooser();
// ...
try {
  UIManager.setLookAndFeel(lookAndFeel); // set look and feel back
} catch (UnsupportedLookAndFeelException e) {
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM