【问题标题】:set RTL Orientation of scrollbar inside JFileChooser?在 JFileChooser 中设置滚动条的 RTL 方向?
【发布时间】:2011-07-17 15:22:40
【问题描述】:

我有一个 JFileChooser,我想让它从右到左定向,为此我使用:

applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

但出现了一个问题。尽管 JFileChooser 对话框的 RTL 方向正确,水平滚动条仍设置在左侧。看这张图:

我该如何解决?

这是一个 SSCCE:

import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileView;
import java.io.File;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
public class MyFileChooser extends JFileChooser
{
    private String extension;
    private String title;
    public MyFileChooser(String extension, String title)
    {
        super();
        this.extension = extension;
        this.title = title;
        addChoosableFileFilter(new FileNameExtensionFilter(String.format("(*.%1$s) فقط %1$s ملفات", extension), extension));
        applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    }

    @Override public String getDialogTitle()
    {
        return title;
    }
}

主要:

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import java.awt.event.*;
    public class MainFrame extends JFrame implements ActionListener
    {
        public MyFileChooser chooser;
        public MainFrame()
        {
            super("Main Frame");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
            catch(Exception e){ System.out.println("Unable to load Windows look and feel");}
            setPreferredSize(new Dimension(300, 100));
            ((JPanel) getContentPane()).setBorder(new EmptyBorder(13, 13, 13, 13) );
            setLayout(new FlowLayout());
            JButton btn = new JButton("Open");
            btn.setActionCommand("myButton");
            btn.addActionListener(this);
            add(btn);
            JPanel panel = new JPanel();

            chooser = new MyFileChooser("aaa", "The Title");
            chooser.setAcceptAllFileFilterUsed(false);
            chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            chooser.setFileHidingEnabled(false);

            pack();
            setLocationRelativeTo(null);
            setVisible(true);
            setResizable(false);
        }
        public void actionPerformed(ActionEvent e)
        {
            if(e.getActionCommand().equals("myButton"))
            {
                int status = chooser.showOpenDialog(null);
                // blah blah
            }
        }
        public static void main(String[] args)
        {
            new MainFrame();
        }
    }

另外,我想过以下解决方案,但没有影响:

JScrollBar scr = new JScrollBar();
scr.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
UIManager.put("JScrollPane.ScrollBar", scr);

【问题讨论】:

标签: java swing jfilechooser right-to-left


【解决方案1】:

....我认为通过将PropertyChangeListener 添加到JFileChooser 您可以收听isVisible();或 isDisplayable ... 并提取 JComponents JFileChooser(复合组件)然后调用 getMyComponents();

private void getMyComponents() {
    Component findList = getJList(chooser);
    JList myList = (JList) findList;
    //find fileName in the JList and move with ViewPort view to the expected Rectangle
    Component myScrollPane = getJScrollPane(chooser);
    JScrollPane scrollPane = (JScrollPane) myScrollPane;
    JViewport vport = scrollPane.getViewport();
    //move with ViewPort view to the expected Rectangle
}

private Component getJList(Component comp) {
    if (comp.getClass() == JList.class) {
        return comp;
    }
    if (comp instanceof Container) {
        Component[] components = ((Container) comp).getComponents();
        for (int i = 0; i < components.length; i++) {
            Component child = getJList(components[i]);
            if (child != null) {
                return child;
            }
        }
    }
    return null;
}

private Component getJScrollPane(Component comp) {
    if (comp.getClass() == JScrollPane.class) {
        return comp;
    }
    if (comp instanceof Container) {
        Component[] components = ((Container) comp).getComponents();
        for (int i = 0; i < components.length; i++) {
            Component child = getJScrollPane(components[i]);
            if (child != null) {
                return child;
            }
        }
    }
    return null;
}

【讨论】:

    【解决方案2】:

    您尝试拨打UIManager.put("JScrollPane.ScrollBar", scr); 很好。我认为它不起作用,因为 FileChooser 会覆盖此设置或在您执行此调用之前创建。

    我建议您在文件选择器被创建为 JContainer 之后尝试“发现”它。找到您的滚动条(或者可能是 JScrollPane)并调用 applyComponentOrientation。 我还没有尝试过,但我很快就会需要这样的功能,所以我很高兴知道这是否适合你。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多