使用Nimbus时在JFileChooser文件名字段中选择文本

时间:2016-10-12 12:01:26

标签: java swing jtextfield jfilechooser nimbus

我最初在JFileChooser对话框中询问了相关的question选择文件名。现在看来实际问题出在Nimbus上:使用它时,文件名字段中的文本不会自动选中。我正在尝试以编程方式解决这个问题。

使用我从如何禁用“文件名”字段的问题的答案中获得的一些代码,我可以找到相关的JTextField(以下示例)。

使用以下方法禁用它:

setEnabled(false);

完美无缺。但是,我需要做一些事情:

setSelectionStart(0);
setSelectionEnd(textField.getText().length());

有没有办法实现这个目标?

package stackoverflow;

import java.awt.Component;
import java.awt.Container;
import java.io.*;

import javax.swing.*;

public class StackOverflow {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            javax.swing.UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                } catch (Exception ex) {
                }
                showFileChooser();
            }
        });
    }

    private static void showFileChooser() {
        JFileChooser chooser = new JFileChooser();
        chooser.setSelectedFile(new File("C:\\SomeFile.txt"));
        selectFileName(chooser);
        int returnVal = chooser.showOpenDialog(null);
        if(returnVal == JFileChooser.APPROVE_OPTION)
        System.out.println("You chose to open this file: " + chooser.getSelectedFile().getName());
    }

    private static boolean selectFileName(Container cont) {
        Component[] cmps = cont.getComponents();
        for (Component cmp : cmps) {
            if (cmp instanceof JTextField) {

                ((JTextField) cmp).setSelectionStart(0);
                ((JTextField) cmp).setSelectionEnd(((JTextField) cmp).getText().length());
                System.out.println(((JTextField) cmp).getSelectedText());
                ((JTextField) cmp).requestFocusInWindow();

                return true;
            }
            if (cmp instanceof Container) {
                if (selectFileName(((Container) cmp)))
                return true;
            }
        }
        return false;
    }
}

0 个答案:

没有答案