JFileChooser:设置名称文本字段未启用
JFileChooser: set the name text field not enabled
我正在使用 JFileChooser
让用户保存文件。
但我不希望用户选择一个名称来保存文件。不得启用名称文本字段。
我阅读了文档,但没有找到这样的方法或 属性。
评论区的Squiddie给大家推荐了一个好的解决方案。但是,如果仍然想禁用文本字段,那么文件的名称对用户可见(JFileChooser.DIRECTORIES_ONLY 是 而不是 ),您可以按顺序使用以下代码"grab" 选择器中的文本字段并禁用它。
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class TextFieldFromFileChooser {
public TextFieldFromFileChooser() {
JFileChooser chooser = new JFileChooser();
JTextField fileChooserTextField = getFileChooserTextField(chooser);
fileChooserTextField.setText("I name this file.txt");
fileChooserTextField.setEditable(false);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
// Selected file has the name of the fileChooserTextField' text
System.out.println(chooser.getSelectedFile().getAbsolutePath());
}
}
private static JTextField getFileChooserTextField(JFileChooser chooser) {
JTextField f = null;
for (Component c : getComponents(chooser)) {
if (c instanceof JTextField){
f = (JTextField) c;
break;
}
}
return f;
}
private static List<Component> getComponents(JComponent component) {
List<Component> list = new ArrayList<>();
for (Component c : component.getComponents()) {
if (c instanceof JPanel)
list.addAll(getComponents((JPanel) c));
else if (c instanceof JTextField)
list.add((JTextField) c);
}
return list;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new TextFieldFromFileChooser());
}
}
请注意,这已经通过 Windows LAF 和 java 的库存 LAF 进行了测试。如果您的选择器有 2 个文本字段(我不知道 MAC/linux 是怎么回事),您可能会遇到问题,因为您不知道要禁用哪个文本字段。
我正在使用 JFileChooser
让用户保存文件。
但我不希望用户选择一个名称来保存文件。不得启用名称文本字段。
我阅读了文档,但没有找到这样的方法或 属性。
评论区的Squiddie给大家推荐了一个好的解决方案。但是,如果仍然想禁用文本字段,那么文件的名称对用户可见(JFileChooser.DIRECTORIES_ONLY 是 而不是 ),您可以按顺序使用以下代码"grab" 选择器中的文本字段并禁用它。
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class TextFieldFromFileChooser {
public TextFieldFromFileChooser() {
JFileChooser chooser = new JFileChooser();
JTextField fileChooserTextField = getFileChooserTextField(chooser);
fileChooserTextField.setText("I name this file.txt");
fileChooserTextField.setEditable(false);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
// Selected file has the name of the fileChooserTextField' text
System.out.println(chooser.getSelectedFile().getAbsolutePath());
}
}
private static JTextField getFileChooserTextField(JFileChooser chooser) {
JTextField f = null;
for (Component c : getComponents(chooser)) {
if (c instanceof JTextField){
f = (JTextField) c;
break;
}
}
return f;
}
private static List<Component> getComponents(JComponent component) {
List<Component> list = new ArrayList<>();
for (Component c : component.getComponents()) {
if (c instanceof JPanel)
list.addAll(getComponents((JPanel) c));
else if (c instanceof JTextField)
list.add((JTextField) c);
}
return list;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new TextFieldFromFileChooser());
}
}
请注意,这已经通过 Windows LAF 和 java 的库存 LAF 进行了测试。如果您的选择器有 2 个文本字段(我不知道 MAC/linux 是怎么回事),您可能会遇到问题,因为您不知道要禁用哪个文本字段。