Настройка Java JFilechooser - PullRequest
       18

Настройка Java JFilechooser

1 голос
/ 29 июля 2011

дальше к моему вопросу 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 at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) at sun.reflect.NativeConstructorAccessorImpl.newInstance (неизвестный источник) at 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 at javax.swing.plaf.basic.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)

1 Ответ

1 голос
/ 29 июля 2011

JFileChooser имеет метод setUI для переопределения.JFileChooser является подклассом JComponent, который имеет этот метод.Его подпись setUI (ComponentUI) .

Я обновил свой ответ, добавив в него простое приложение для демонстрации настройки пользовательского делегата пользовательского интерфейса для моего специального подкласса средства выбора файлов.Предполагается, что вы работаете под Windows L & F, поэтому, если вы этого не сделаете, вам потребуется обновить подкласс средства выбора файлов, чтобы расширить соответствующий базовый делегат пользовательского интерфейса.Избегайте использования 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();
        }
    }

}
...