【问题标题】:Java JFilechooser customizationJava JFilechooser 自定义
【发布时间】:2011-07-29 13:50:23
【问题描述】:

进一步回答我的问题Java JFilechooser。建议扩展 BasicFileChooserUI,覆盖 create/getModel 并提供 BasicDirectoryModel 的实现。

我尝试了这个,但是我无法做到。

JFileChooser 没有 setUI 方法。因此,您唯一的选择是覆盖 getUI。

    JFileChooser blah = new JFileChooser()
    {
        CustomFileChooserUI asdf = null;
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        public FileChooserUI getUI() 
        {
            if (asdf == null)
            {
                asdf = new CustomFileChooserUI(this);
            }
            return asdf;
        }
    };

public class CustomFileChooserUI extends BasicFileChooserUI
{
    public CustomFileChooserUI(JFileChooser b) 
    {
        super(b);
    }

    @Override
    protected void createModel() 
    {
        // TODO Auto-generated method stub
        super.createModel();
    }
}

但我得到了例外。请帮忙

java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源) 在 java.lang.reflect.Constructor.newInstance(未知来源) 在 org.eclipse.ve.internal.java.vce.launcher.remotevm.JavaBeansLauncher.main(JavaBeansLauncher.java:86) 引起:java.lang.NullPointerException 在 javax.swing.plaf.basic.BasicFileChooserUI$BasicFileView.getName(Unknown Source)IWAV0052E 创建 qwere 的调用目标异常

at javax.swing.JFileChooser.getName(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxRenderer.getListCellRendererComponent(Unknown Source)
at javax.swing.plaf.basic.BasicListUI.updateLayoutState(Unknown Source)
at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.valueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
at javax.swing.DefaultListSelectionModel.setSelectionInterval(Unknown Source)
at javax.swing.JList.setSelectedIndex(Unknown Source)
at javax.swing.plaf.basic.BasicComboPopup.setListSelection(Unknown Source)
at javax.swing.plaf.basic.BasicComboPopup.access$300(Unknown Source)
at javax.swing.plaf.basic.BasicComboPopup$Handler.itemStateChanged(Unknown Source)
at javax.swing.JComboBox.fireItemStateChanged(Unknown Source)
at javax.swing.JComboBox.selectedItemChanged(Unknown Source)
at javax.swing.JComboBox.contentsChanged(Unknown Source)
at javax.swing.AbstractListModel.fireContentsChanged(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.setSelectedItem(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.addItem(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel.access$900(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI.doDirectoryChanged(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI.access$1200(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI$5.propertyChange(Unknown Source)
at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
at java.awt.Component.firePropertyChange(Unknown Source)
at javax.swing.JFileChooser.setCurrentDirectory(Unknown Source)
at javax.swing.JFileChooser.<init>(Unknown Source)
at javax.swing.JFileChooser.<init>(Unknown Source)
at qwere$1.<init>(qwere.java:12)

【问题讨论】:

    标签: java jfilechooser


    【解决方案1】:

    JFileChooser 确实有一个 setUI 方法可以覆盖。 JFileChooser 是具有该方法的 JComponent 的子类。它的签名是setUI(ComponentUI)

    我已更新我的答案以包含一个简单的应用程序,以展示为我的文件选择器的特殊子类设置自定义 UI 委托。它假定您在 Windows L&F 下运行,因此如果您不是,则需要更新文件选择器的子类以扩展正确的基本 UI 委托。避免使用 BasicFileChooserUI,否则您将看不到任何内容。

    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class FileChooserUIExample extends JFrame {
        public static void main(String args[]) {
            SwingUtilities.invokeLater(new Runnable() {
    
                public void run() {
                    new FileChooserUIExample();
                }
            });
        }
    
        public FileChooserUIExample() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                e.printStackTrace();
            }
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JButton button = new JButton("Show the file chooser");
            final JFileChooser chooser = new MyCustomFileChooser();
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    chooser.showOpenDialog(FileChooserUIExample.this);
                }
            });
            getContentPane().add(button, BorderLayout.CENTER);
            pack();
            setVisible(true);
        }
    }
    

    这是自定义文件选择器类。

    import com.sun.java.swing.plaf.windows.WindowsFileChooserUI;
    import javax.swing.JFileChooser;
    
    
    public class MyCustomFileChooser extends JFileChooser {
        public MyCustomFileChooser() {
            super();
    
            setUI(new CustomFileChooserUI(this));
        }
    
    
        public class CustomFileChooserUI extends WindowsFileChooserUI {
            public CustomFileChooserUI(JFileChooser b) {
                super(b);
                System.out.println("Woohoo! I'm using a custom UI delegate!");
            }
    
            @Override
            protected void createModel() {
                // TODO Auto-generated method stub
                super.createModel();
            }
        }
    
    }
    

    【讨论】:

    • 啊,我试图调用这个方法(它是受保护的),而不是试图覆盖它。
    • 单个实例或所有实例会有什么不同?
    • 如果您仅在 JFileChooser 的一个实例上设置 UI 委托,则只有该实例的行为会有所不同。如果您想更改任何 JFileChooser 实例的行为,请确保为所有实例设置 UI 委托。查看 WindowsLookAndFeel.initClassDefaults 以了解这是如何完成的。在那里,您将看到组件 UI 到 UI 委托的映射。对于条目“FileChooserUI”,您将看到它映射到“WindowsFileChooserUI”。每当您在应用中更改 L&F 时,UI 代理都会重新加载,因此如果您的应用允许动态更改 L&F,您应该注意这一点。
    • 然后我想自定义一个实例。我尝试过覆盖 setUI,但我仍然有例外。可以举个小例子
    • 我会写一个小例子并在这里发布。不过给我几个小时。日常工作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多