我在JMenu中遇到JFileChooser的问题。目前,我已经为背景JLabel设置了一个图标,效果很好。但是您只能从跳过文件夹或使用上一级目录按钮中选择一个文件。例如,如果我尝试使用下拉菜单选择一个目录(例如Desktop),则JMenu的焦点消失了,而JFileChooser也消失了,剩下的就是下拉菜单,它只是浮动在那儿。单击任何目录后,下拉菜单也会消失,并且不执行任何操作(不选择目录)。
到目前为止,这是我的代码:已编辑已更改为测试代码,因此您可以自己查看问题。
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFileChooser;
public class test {
private JFrame frame;
public test() {
frame = new JFrame();
frame.setBounds(100, 100, 686, 462);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu mntest = new JMenu("test");
menuBar.add(mntest);
JFileChooser fileChooser = new JFileChooser();
mntest.add(fileChooser);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
test window = new test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
我已经尝试弄乱设置一段时间了,但是在选择下拉菜单时却想不出如何使焦点集中在菜单上。
任何帮助都会很棒。我敢肯定这是简单而愚蠢的,但是我似乎找不到它。
最佳答案
好的,不要将JFileChooser
添加到JMenu
中,而是添加一个JMenuItem
,当触发时,它会显示选择器对话框
有关更多详细信息,请参见How to Use File Choosers
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class Test {
private JFrame frame;
public Test() {
frame = new JFrame();
frame.setBounds(100, 100, 686, 462);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu mntest = new JMenu("test");
menuBar.add(mntest);
JMenuItem mi = new JMenuItem("Open...");
mntest.add(mi);
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
switch (fileChooser.showOpenDialog(frame)) {
case JFileChooser.APPROVE_OPTION:
// Open file...
break;
}
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test window = new Test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}