创建自定义 JFileChooser

Eng*_*uad 7 java swing jfilechooser arabic right-to-left

要创建阿拉伯语 JFileChooser (RTL),我使用以下命令:

\n\n

我的文件选择器:

\n\n
import javax.swing.JOptionPane;\nimport javax.swing.UIManager;\nimport javax.swing.JFileChooser;\nimport javax.swing.filechooser.FileNameExtensionFilter;\nimport javax.swing.filechooser.FileView;\nimport java.io.File;\nimport java.awt.ComponentOrientation;\nimport java.awt.Dimension;\npublic class MyFileChooser extends JFileChooser\n{\n    private String extension;\n    private String title;\n    public MyFileChooser(String extension, String title)\n    {\n        super();\n        this.extension = extension;\n        this.title = title;\n        addChoosableFileFilter(new FileNameExtensionFilter(String.format("(*.%1$s) \xd9\x81\xd9\x82\xd8\xb7 %1$s \xd9\x85\xd9\x84\xd9\x81\xd8\xa7\xd8\xaa", extension), extension));\n        applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);\n        //setPreferredSize(new Dimension(450, 350));\n    }\n\n    @Override public String getDialogTitle()\n    {\n        return title;\n    }\n\n    @Override public File getSelectedFile()\n    {\n        File selectedFile = super.getSelectedFile();\n        if(selectedFile != null)\n        {\n            String name = selectedFile.getName();\n            if(!name.contains(".")) selectedFile = new File(selectedFile.getParentFile(), name + \'.\' + extension);\n        }\n        return selectedFile;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

主要的:

\n\n
import java.awt.*;\nimport javax.swing.*;\nimport javax.swing.border.*;\nimport java.awt.event.*;\npublic class MainFrame extends JFrame implements ActionListener\n{\n    public MyFileChooser chooser;\n    public MainFrame()\n    {\n        super("Main Frame");\n        setDefaultCloseOperation(EXIT_ON_CLOSE);\n        try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}\n        catch(Exception e){ System.out.println("Unable to load Windows look and feel");}\n        setPreferredSize(new Dimension(300, 100));\n        ((JPanel) getContentPane()).setBorder(new EmptyBorder(13, 13, 13, 13) );\n        setLayout(new FlowLayout());\n        JButton btn = new JButton("Open");\n        btn.setActionCommand("myButton");\n        btn.addActionListener(this);\n        add(btn);\n        JPanel panel = new JPanel();\n\n        UIManager.put("FileChooser.saveButtonText", "\xd8\xad\xd9\x81\xd8\xb8");\n        UIManager.put("FileChooser.openButtonText", "\xd9\x81\xd8\xaa\xd8\xad");\n        UIManager.put("FileChooser.cancelButtonText", "\xd8\xa5\xd9\x84\xd8\xba\xd8\xa7\xd8\xa1");\n        UIManager.put("FileChooser.updateButtonText", "\xd8\xaa\xd8\xad\xd8\xaf\xd9\x8a\xd8\xab");\n        UIManager.put("FileChooser.helpButtonText", "\xd9\x85\xd8\xb3\xd8\xa7\xd8\xb9\xd8\xaf\xd8\xa9");\n        UIManager.put("FileChooser.saveButtonToolTipText", "\xd8\xad\xd9\x81\xd8\xb8 \xd9\x85\xd9\x84\xd9\x81");\n        UIManager.put("FileChooser.openButtonToolTipText", "\xd9\x81\xd8\xaa\xd8\xad \xd9\x85\xd9\x84\xd9\x81");\n        UIManager.put("FileChooser.cancelButtonToolTipText", "\xd8\xa5\xd9\x84\xd8\xba\xd8\xa7\xd8\xa1");\n        UIManager.put("FileChooser.updateButtonToolTipText", "\xd8\xaa\xd8\xad\xd8\xaf\xd9\x8a\xd8\xab");\n        UIManager.put("FileChooser.helpButtonToolTipText", "\xd9\x85\xd8\xb3\xd8\xa7\xd8\xb9\xd8\xaf\xd8\xa9");\n        UIManager.put("FileChooser.listViewButtonToolTipText", "\xd9\x82\xd8\xa7\xd8\xa6\xd9\x85\xd8\xa9");\n        UIManager.put("FileChooser.lookInLabelText", "\xd8\xa8\xd8\xad\xd8\xab \xd9\x81\xd9\x8a:");\n        UIManager.put("FileChooser.newFolderToolTipText", "\xd8\xa5\xd9\x86\xd8\xb4\xd8\xa7\xd8\xa1 \xd9\x85\xd8\xac\xd9\x84\xd8\xaf \xd8\xac\xd8\xaf\xd9\x8a\xd8\xaf");\n        UIManager.put("FileChooser.fileNameLabelText", "\xd8\xa7\xd8\xb3\xd9\x85 \xd8\xa7\xd9\x84\xd9\x85\xd9\x84\xd9\x81:");\n        UIManager.put("FileChooser.filesOfTypeLabelText", "  \xd9\x86\xd9\x88\xd8\xb9 \xd8\xa7\xd9\x84\xd9\x85\xd9\x84\xd9\x81:");\n        UIManager.put("FileChooser.detailsViewButtonToolTipText", "\xd8\xaa\xd9\x81\xd8\xa7\xd8\xb5\xd9\x8a\xd9\x84");\n        UIManager.put("FileChooser.upFolderToolTipText", "\xd9\x84\xd9\x84\xd8\xa3\xd8\xb9\xd9\x84\xd9\x89")\n\n        chooser = new MyFileChooser("aaa", "\xd8\xa7\xd9\x84\xd8\xb9\xd9\x86\xd9\x88\xd8\xa7\xd9\x86");\n        chooser.setAcceptAllFileFilterUsed(false);\n        chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);\n        chooser.setFileHidingEnabled(false);\n\n        pack();\n        setLocationRelativeTo(null);\n        setVisible(true);\n        setResizable(false);\n    }\n    public void actionPerformed(ActionEvent e)\n    {\n        if(e.getActionCommand().equals("myButton"))\n        {\n            int status = chooser.showOpenDialog(null);\n            // blah blah\n        }\n    }\n    public static void main(String[] args)\n    {\n        new MainFrame();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

屏幕截图:

\n\n

在此输入图像描述

\n\n

在此输入图像描述

\n\n

一切都很酷,除了某些部分我需要修改它们以便我可以获得阿拉伯语 JFileChooser:

\n\n
    \n
  • 当列表视图打开时,滚动条始终设置在左侧。我该如何修复它?
  • \n
  • 在详细信息视图中,表的标题是用英文书写的。我如何修改它或至少禁用详细信息视图?
  • \n
  • “最近的项目”、“桌面”、“我的文档”、“计算机”和“网络”标签如何修改或至少删除它们?
  • \n
\n

oth*_*man 2

下面是一个有趣的类,它自定义了 JFileChooser。它可以激励您进行更有趣的定制。看一下customizeFileChooser()方法。希望这可以帮助。

public class MyJFileChooser extends JFileChooser {

    private static final int COLUMN_FILENAME = 0;
    private static final int COLUMN_FILESIZE = 1;
    private static final int COLUMN_FILETYPE = 2;
    private static final int COLUMN_FILEDATE = 3;
    private static final int COLUMN_FILEATTR = 4;
    private static final int COLUMN_COLCOUNT = 5;
    private static String[] COLUMNS = null;
    Vector detailsBtn = new Vector();
    UI ui;
    static JTable tbl;



    public void customizeFileChooser(Component[] comp) {

        int cnt = 1;

        for (int x = 0; x < comp.length; x++) {
            if (comp[x] instanceof JPanel) {
                customizeFileChooser(((JPanel) comp[x]).getComponents());


                Component[] c = ((JPanel) comp[x]).getComponents();
                for (int i = 0; i < c.length; i++) {

                    if (c[i] instanceof JTextField) {
                        ((JTextField) c[i]).setVisible(false);

                    }
                    if (c[i] instanceof JToggleButton) {

                        detailsBtn.add((JToggleButton) c[i]);
                        ((JToggleButton) c[i]).doClick();

                    }

                    if (c[i] instanceof JLabel) {

                        JLabel lbl = (JLabel) c[i];

                        if (x == 0 && i == 0) {
                            lbl.setVisible(false);
                        } else if (x == 2 && i == 0) {
                            lbl.setVisible(false);
                        } else if (x == 0 && i == 1) {

                            lbl.setVisible(false);
                        }

                    }

                    if (c[i] instanceof JComboBox) {
                        JComboBox b = (JComboBox) c[i];
                        if (x == 0 && i == 1) {
                            b.setVisible(false);
                        }
                        if (x == 2 && i == 1) {
                            b.setVisible(false);
                        }
                        if (x == 2 && i == 3) {
                            b.setVisible(false);
                        }


                    }

                }
            }
        }

    }

    public MyJFileChooser() {
        if (COLUMNS == null) {
            Locale l = getLocale();
            COLUMNS = new String[]{
                        UIManager.getString("FileChooser.fileNameHeaderText", l),
                        UIManager.getString("FileChooser.fileSizeHeaderText", l),
                        UIManager.getString("FileChooser.fileTypeHeaderText", l),
                        UIManager.getString("FileChooser.fileDateHeaderText", l),
                        UIManager.getString("FileChooser.fileAttrHeaderText", l)
                    };
        }

    }

    public void show() {
        MyJFileChooser fc = new MyJFileChooser();
        fc.showOpenDialog(MyJFileChooser.this);

    }


    /**************************************************************************
     * Always create the local UI
     * @param comp
     *************************************************************************/
    public final void setUI(ComponentUI comp) {
        super.setUI(ui = new UI(this));

    }


    /**************************************************************************
     * Internal implementation of Metal LookAndFeel to create the table sorting
     * ability.
     *************************************************************************/
    private final static class UI extends MetalFileChooserUI {

        private DirectoryModel model;

        /**************************************************************************
         * Must be overridden to extend
         * @param e
         *************************************************************************/
        public UI(JFileChooser e) {
            super(e);
        }

        /**************************************************************************
         * Overridden to create our own model
         *************************************************************************/
        protected final void createModel() {
            model = new DirectoryModel(getFileChooser());

        }

        /**************************************************************************
         * Overridden to get our own model
         * @return
         *************************************************************************/
        public final BasicDirectoryModel getModel() {
            return model;
        }

        /**************************************************************************
         * Calls the default method then adds a MouseListener to the JTable
         * @param chooser
         * @return
         *************************************************************************/
        protected final JPanel createDetailsView(JFileChooser chooser) {
            final JPanel panel = super.createDetailsView(chooser);

            //Since we can't access MetalFileChooserUI's private member detailsTable
            //directly, we have to find it in the JPanel
            tbl = findJTable(panel.getComponents());
            if (tbl != null) {

                //Fix the columns so they can't be rearranged, if we don't do this
                //we would need to keep track when each column is moved
                tbl.getTableHeader().setReorderingAllowed(false);

                //Add a mouselistener to listen for clicks on column headers
                tbl.getTableHeader().addMouseListener(new MouseAdapter() {

                    public void mouseClicked(MouseEvent e) {
                        //Only process single clicks
                        if (e.getClickCount() > 1) {
                            return;
                        }
                        e.consume();
                        final int col = tbl.getTableHeader().columnAtPoint(e.getPoint());
                        if (col == COLUMN_FILENAME || col == COLUMN_FILESIZE
                                || col == COLUMN_FILEDATE) {
                            model.sort(col, tbl);
                        }
                    }
                });
            }
            return panel;
        }

        /**************************************************************************
         * Finds the JTable in the panel so we can add MouseListener
         * @param comp
         * @return
         *************************************************************************/
        private final static JTable findJTable(Component[] comp) {
            for (int i = 0; i < comp.length; i++) {
                if (comp[i] instanceof JTable) {
                    return (JTable) comp[i];
                }
                if (comp[i] instanceof Container) {
                    JTable tbl = findJTable(((Container) comp[i]).getComponents());
                    if (tbl != null) {
                        return tbl;
                    }
                }
            }
            return null;
        }
    }

    /***************************************************************************
     * Implementation of BasicDirectoryModel that sorts the Files by column
     **************************************************************************/
    private final static class DirectoryModel extends BasicDirectoryModel {

        int col = 0;
        boolean ascending;

        /**************************************************************************
         * Must be overridden to extend BasicDirectoryModel
         * @param chooser
         *************************************************************************/
        DirectoryModel(JFileChooser chooser) {
            super(chooser);
        }

        /**************************************************************************
         * Supposedly this is not used anymore, hopefully not.  We implemented
         * some basic attempt at sorting just in case
         * @param a
         * @param b
         * @return
         *************************************************************************/
        protected final boolean lt(File a, File b) {
            System.out.println("LT called?");
            boolean less = false;
            switch (col) {
                case COLUMN_FILEDATE:
                    less = a.lastModified() > b.lastModified();
                    break;
                case COLUMN_FILESIZE:
                    less = a.length() > b.length();
                    break;
                default:
                    less = a.getName().compareToIgnoreCase(b.getName()) > 0;
                    break;
            }
            if (ascending) {
                return less = !less;
            }
            return less;
        }

        /**************************************************************************
         * Resorts the JFileChooser table based on new column
         * @param c
         *************************************************************************/
        protected final void sort(int c, JTable tbl) {
            //Set column and order
            col = c;
            ascending = !ascending;
            String indicator = " (^)";
            if (ascending) {
                indicator = " (v)";
            }

            final JTableHeader th = tbl.getTableHeader();
            final TableColumnModel tcm = th.getColumnModel();

            for (int i = 0; i < MyJFileChooser.COLUMN_COLCOUNT - 1; i++) {
                final TableColumn tc = tcm.getColumn(i); // the column to change
                tc.setHeaderValue(COLUMNS[i]);
            }

            final TableColumn tc = tcm.getColumn(col); // the column to change
            tc.setHeaderValue(COLUMNS[col] + indicator);

            th.repaint();

            //Requery the file listing
            validateFileCache();
        }

        /**************************************************************************
         * Sorts the data based on current column setting
         * @param data
         *************************************************************************/
        protected final void sort(Vector data) {
            switch (col) {
                case COLUMN_FILEDATE:
                    Collections.sort(data, new Comparator() {

                        public int compare(Object o1, Object o2) {
                            int ret = 1;
                            final File a = (File) o1;
                            final File b = (File) o2;
                            if (a.lastModified() > b.lastModified()) {
                                ret = -1;
                            } else if (a.lastModified() == b.lastModified()) {
                                ret = 0;
                            }

                            if (ascending) {
                                ret *= -1;
                            }
                            return ret;
                        }
                    });
                    break;
                case COLUMN_FILESIZE:
                    Collections.sort(data, new Comparator() {

                        public int compare(Object o1, Object o2) {
                            int ret = 1;
                            final File a = (File) o1;
                            final File b = (File) o2;
                            if (a.length() > b.length()) {
                                ret = -1;
                            } else if (a.length() == b.length()) {
                                ret = 0;
                            }

                            if (ascending) {
                                ret *= -1;
                            }
                            return ret;
                        }
                    });
                    break;
                case COLUMN_FILENAME:
                    Collections.sort(data, new Comparator() {

                        public int compare(Object o1, Object o2) {
                            final File a = (File) o1;
                            final File b = (File) o2;
                            if (ascending) {
                                return a.getName().compareToIgnoreCase(b.getName());
                            } else {
                                return -1 * a.getName().compareToIgnoreCase(b.getName());
                            }
                        }
                    });
                    break;
            }
        }
    }
    }
Run Code Online (Sandbox Code Playgroud)