我有JFrame
JFileChooser
。需要有一个自定义导入按钮而不是默认文件选择器操作按钮。
如果我使用自定义操作按钮,如果我在“文件名”文本框中输入值,则JFileChooser.getSelectedFile()
将返回null。然而,如果我单击该文件并单击自定义导入,我可以获取我选择的文件。
这里我包含了重现此
的示例代码import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class FileChooserDemo extends JPanel
implements ActionListener {
private static final long serialVersionUID = 1L;
JFileChooser importFileChooser;
JFrame frame;
private void createAndShowGUI() {
//Create and set up the window.
frame = new JFrame("FileChooserDemo");
JPanel inputJobDetailsPanel = new JPanel(new BorderLayout(0,5));
importFileChooser = new JFileChooser();
importFileChooser.setControlButtonsAreShown(false);
importFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
importFileChooser.setMultiSelectionEnabled(false);
inputJobDetailsPanel.add(importFileChooser, BorderLayout.CENTER);
GridBagLayout importButtonPanelLayout = new GridBagLayout();
importButtonPanelLayout.columnWidths = new int[] {150};
importButtonPanelLayout.rowHeights = new int[] {30};
JPanel importButtonPanel = new JPanel();
importButtonPanel.setLayout(importButtonPanelLayout);
JButton importButton = new JButton("Custom Import");
importButton.setActionCommand("import");
importButton.addActionListener(this);
importButtonPanel.add(importButton, new GridBagConstraints());
JButton OtherButton = new JButton("Other Action");
OtherButton.setActionCommand("otherImport");
OtherButton.addActionListener(this);
importButtonPanel.add(OtherButton, new GridBagConstraints());
inputJobDetailsPanel.add(importButtonPanel, BorderLayout.PAGE_END);
frame.add(inputJobDetailsPanel);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new FileChooserDemo().createAndShowGUI();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.equals("import")) {
if(importFileChooser.getSelectedFile() == null) {
JOptionPane.showMessageDialog(frame, "You entered file name but getSelectedFile() return null");
}else {
JOptionPane.showMessageDialog(frame, "Chosen File Name: " + importFileChooser.getSelectedFile().getName());
}
}else {
JOptionPane.showMessageDialog(frame, "You clicked other action");
}
}
}
O / P:
重现的步骤:
注意:如果我使用importFileChooser.setControlButtonsAreShown(true);
我甚至可以在文本框中输入getSelectedFile(),而无需单击该文件。
其实我正在尝试编写自动化脚本,所以我只能通过“文件名”文本框输入文件路径。
任何想法通过getSelectedFile()获取文件而不点击文件??
答案 0 :(得分:1)
因为不是所有的Look&感觉实现提供了在文本字段 * 中直接输入文件名,您可能需要考虑替代设计:
较少模式:如Providing an Accessory Component所示,您可以在面板中添加附件组件,并在其上添加更多控件,例如在功能之间切换的复选框。"具体细节取决于自定义导入和其他操作启用的功能。
更多模式:在用户批准特定部分后,显示选项的模式对话框。
建议here的中间方法具有以下限制:
假设javax.swing.plaf.metal.MetalLookAndFeel
。
ActionEvent
:"如果任何特定id
实例的ActionEvent
参数不在ACTION_FIRST
范围内,则会导致未指明的行为到ACTION_LAST
。
ActionEvent
:" null
命令字符串是合法的,但不推荐。"
*例如com.apple.laf.AquaLookAndFeel
答案 1 :(得分:1)
最后我得到了预期的输出。调用默认文件选择器按钮动作侦听器
@SuppressWarnings("serial")
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.equals("import")) {
if(importFileChooser.getSelectedFile() == null) {
MetalFileChooserUI ui = (MetalFileChooserUI) importFileChooser.getUI();
for(ActionListener a: ui.getDefaultButton(importFileChooser).getActionListeners()) {
a.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null) {
//Nothing need go here, the actionPerformed method (with the above arguments) will trigger the respective listener
});
}
}
if(importFileChooser.getSelectedFile() != null) {
JOptionPane.showMessageDialog(frame, "Chosen File Name: " + importFileChooser.getSelectedFile().getName());
}
else {
JOptionPane.showMessageDialog(frame, "You entered file name but getSelectedFile() return null");
}
}
else {
JOptionPane.showMessageDialog(frame, "You clicked other action");
}
}