嵌入 JFileChooser
Embedding JFileChooser
我正在尝试添加一个 JFileChooser
,其中 select 是父目录并允许用户输入文件名。我知道 showSaveDialog
和 showOpenDialog
方法,但是我不想创建新的 window.
这是我目前的情况:
public class BrowserTest extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
BrowserTest frame = new BrowserTest();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public BrowserTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JFileChooser browser = new JFileChooser();
browser.setFileFilter(new FileFilter() {
@Override
public String getDescription() {
return "A .extension file";
}
@Override
public boolean accept(File f) {
return f.isDirectory();
}
});
browser.setDialogType(JFileChooser.SAVE_DIALOG);
browser.setSelectedFile(new File("*.extension"));
browser.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final String action = e.getActionCommand();
if(action.equals(JFileChooser.APPROVE_SELECTION)) {
System.out.println("trigger");
File f = browser.getCurrentDirectory();
System.out.println(f);
}
if(action.equals(JFileChooser.CANCEL_SELECTION))
JOptionPane.showConfirmDialog(null, "Start without saving?", "No save directory selected.", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
}
});
contentPane.add(browser);
revalidate();
}
}
出于某种原因,如果我 select 一个文件,按下保存按钮只会执行 System.out.println("trigger");
。有没有办法直接监听保存按钮按下?
您可以使用以下代码访问文件选择器的默认按钮,然后将您自己的侦听器添加到该按钮:
JButton defaultButton = browser.getUI().getDefaultButton(browser);
如前所述,一种解决方案是递归地遍历 JFileBrowser 的组件,直到找到正确的组件,这里是带有操作命令字符串 "Open" 的 JButton。
例如,这个方法可以工作:
public static void recursiveComponentSearch(Component c, String actionCommand,
ActionListener listener) {
if (c instanceof JButton) {
JButton button = (JButton) c;
// TODO: delete the line below
System.out.printf("Text: \"%s\"; action command: \"%s\"%n", button.getText(),
button.getActionCommand());
if (button.getActionCommand().equalsIgnoreCase(actionCommand)) {
button.addActionListener(listener);
}
}
// recursive search here
if (c instanceof Container) {
Container container = (Container) c;
Component[] components = container.getComponents();
for (Component component : components) {
recursiveComponentSearch(component, actionCommand, listener);
}
}
}
像这样使用:
ActionListener listener = evt -> System.out.println("Save button here");
String actionCommand = "Open";
recursiveComponentSearch(browser, actionCommand, listener);
我刚刚发现问题出在browser.setSelectedFile(new File("*.extension"));
行。显然,这种方法不喜欢星号,将其替换为其他任何东西都可以解决问题。例如:browser.setSelectedFile(new File("new.extension"));
将按预期工作。
我正在尝试添加一个 JFileChooser
,其中 select 是父目录并允许用户输入文件名。我知道 showSaveDialog
和 showOpenDialog
方法,但是我不想创建新的 window.
这是我目前的情况:
public class BrowserTest extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
BrowserTest frame = new BrowserTest();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public BrowserTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JFileChooser browser = new JFileChooser();
browser.setFileFilter(new FileFilter() {
@Override
public String getDescription() {
return "A .extension file";
}
@Override
public boolean accept(File f) {
return f.isDirectory();
}
});
browser.setDialogType(JFileChooser.SAVE_DIALOG);
browser.setSelectedFile(new File("*.extension"));
browser.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final String action = e.getActionCommand();
if(action.equals(JFileChooser.APPROVE_SELECTION)) {
System.out.println("trigger");
File f = browser.getCurrentDirectory();
System.out.println(f);
}
if(action.equals(JFileChooser.CANCEL_SELECTION))
JOptionPane.showConfirmDialog(null, "Start without saving?", "No save directory selected.", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
}
});
contentPane.add(browser);
revalidate();
}
}
出于某种原因,如果我 select 一个文件,按下保存按钮只会执行 System.out.println("trigger");
。有没有办法直接监听保存按钮按下?
您可以使用以下代码访问文件选择器的默认按钮,然后将您自己的侦听器添加到该按钮:
JButton defaultButton = browser.getUI().getDefaultButton(browser);
如前所述,一种解决方案是递归地遍历 JFileBrowser 的组件,直到找到正确的组件,这里是带有操作命令字符串 "Open" 的 JButton。
例如,这个方法可以工作:
public static void recursiveComponentSearch(Component c, String actionCommand,
ActionListener listener) {
if (c instanceof JButton) {
JButton button = (JButton) c;
// TODO: delete the line below
System.out.printf("Text: \"%s\"; action command: \"%s\"%n", button.getText(),
button.getActionCommand());
if (button.getActionCommand().equalsIgnoreCase(actionCommand)) {
button.addActionListener(listener);
}
}
// recursive search here
if (c instanceof Container) {
Container container = (Container) c;
Component[] components = container.getComponents();
for (Component component : components) {
recursiveComponentSearch(component, actionCommand, listener);
}
}
}
像这样使用:
ActionListener listener = evt -> System.out.println("Save button here");
String actionCommand = "Open";
recursiveComponentSearch(browser, actionCommand, listener);
我刚刚发现问题出在browser.setSelectedFile(new File("*.extension"));
行。显然,这种方法不喜欢星号,将其替换为其他任何东西都可以解决问题。例如:browser.setSelectedFile(new File("new.extension"));
将按预期工作。