我最初在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;
}
}