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

10-07 12:05