JMenu 问题中的 JFileChooser

JFileChooser in a JMenu Issue

我在使用 JMenu 中的 JFileChooser 时遇到问题。目前我已经得到它来为背景 JLabel 设置一个图标,效果很好。但是您只能 select 通过文件夹跳转或使用上层目录按钮来获取文件。如果我尝试使用下拉菜单 select 像桌面这样的目录,例如 JMenu 的焦点消失了,JFileChooser 也消失了,剩下的只是漂浮在那里的下拉菜单。只要您单击任何目录,下拉菜单也会消失并且什么都不做(不是 select 目录)。

到目前为止,这是我的代码:已编辑 更改为测试代码,以便您自己查看问题。

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();
            }
        }
    });
}
}

我已经试过一段时间搞乱设置,但无法弄清楚如何在 select 使用下拉菜单时将注意力集中在菜单上。

任何帮助都会很棒。我确定这是简单而愚蠢的事情,但我似乎无法找到它。

好的,不要将 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();
                }
            }
        });
    }
}