繁体   English   中英

Java JFilechooser定制

[英]Java JFilechooser customization

对我的问题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的sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)处的sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)处的java.lang.reflect.InvocationTargetException org.eclipse.ve.internal.java.vce.launcher.remotevm.JavaBeansLauncher.main(JavaBeansLauncher.java:86)上的Constructor.newInstance(未知源)原因:javax.swing.plaf.basic上的java.lang.NullPointerException .BasicFileChooserUI $ BasicFileView.getName(未知源)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)

JFileChooser确实具有要重写的setUI方法。 JFileChooser是具有该方法的JComponent的子类。 它的签名是setUI(ComponentUI)

我已经更新了答案,以包含一个简单的应用程序来炫耀为文件选择器的特殊子类设置自定义UI委托。 假定您在Windows L&F下运行,因此如果您不在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();
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM