[英]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.