8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

将 JFileChooser 置于所有窗口之上

John Snow 1月前

70 0

我似乎在文件选择器对话框的非常简单的实现中遇到了问题,每次都需要我最小化 Netbeans 才能访问它,这让人非常沮丧,特别是……

我似乎在对文件选择器对话框进行非常简单的实现时遇到了问题,每次都需要我最小化 Netbeans 才能访问它,这让人非常沮丧,特别是现在进行测试时。

我在网上看到了一些解决方案,包括 SO ,但似乎都没有解决问题,而其他一些解决方案对于我目前的水平来说似乎非常冗长和复杂。

private void fileSearch() {

    JFileChooser fileSelect = new JFileChooser();
    int returnVal = fileSelect.showOpenDialog(null);
    String pathToFile;

    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File file = fileSelect.getSelectedFile();
        pathToFile = file.getAbsolutePath();
        try {
            P.binaryFileToHexString(pathToFile);
        } catch (Exception e) {
            System.out.print("Oops! there was an error there..." + e);
        }
        System.out.println("\nYou chose to open this file: " + file.getName());
    }
}

我的一些尝试包括使用;

.requestFocus();
.requestFocusInWindow();
.setVisible();

是否有我可以设置的特定属性/方法来解决该问题?

帖子版权声明 1、本帖标题:将 JFileChooser 置于所有窗口之上
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由John Snow在本站《swing》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 你写道(在你的 comment ):

    实际上不是,这是整个程序中唯一使用 UI 的方法,其余的仍然是纯控制台。

    换句话说,您想向 控制台应用程序 ,而您的问题是 JFileChooser 没有成为活动窗口,即具有 键盘焦点 .

    另一个答案 所述 ,问题在于您将 JFileChooser [打开] 对话框的父级设置为空。

    下面的代码创建了一个最小的对话框 JFrame ,它既是 JFileChooser 对话框的父级,也是 顶层容器 。在下面的代码中,通过控制台询问用户是否要选择一个文件。如果答案是 , Y JFileChooser 显示对话框。关闭该对话框后,再次询问用户是否要选择一个文件。因此,我理解,这是一个带有 GUI 组件的控制台应用程序,这就是您想要实现的。

    (代码后的注释。)

    import java.io.File;
    import java.util.Scanner;
    
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    
    public class SlctFile {
    
        private static void fileSearch() {
            JFrame frame = new JFrame();
            frame.setAlwaysOnTop(true);
            frame.setVisible(true);
            JFileChooser fileSelect = new JFileChooser();
            int returnVal = fileSelect.showOpenDialog(frame);
            String pathToFile;
    
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fileSelect.getSelectedFile();
                pathToFile = file.getAbsolutePath();
                try {
                    P.binaryFileToHexString(pathToFile);
                }
                catch (Exception e) {
                    System.out.print("Oops! there was an error there..." + e);
                }
                System.out.println("\nYou chose to open this file: " + file.getName());
            }
            frame.dispose();
        }
    
        public static void main(String[] args) {
            String answer;
            Scanner stdin = new Scanner(System.in);
            do {
                System.out.print("Select file? ");
                answer = stdin.nextLine();
                if ("Y".equalsIgnoreCase(answer)) {
                    fileSearch();
                }
            } while ("Y".equalsIgnoreCase(answer));
            System.exit(0);
        }
    }
    
    • 方法 setAlwaysOnTop 确保将 JFrame 成为活动窗口。
    • 一旦 JFrame 显示 ,就 JFileChooser 立即显示 。
    • 调用方法 exit 是必需的,因为显示 JFrame 会启动 事件分派线程 (EDT)。当主线程终止时,EDT 不会终止,因此调用方法 exit 可确保 JVM 终止。
  • fileSelect.showOpenDialog(this)
    

    当然, this 必须是某种类型的组件(主界面的 JFrame 或 JPanel)。如果希望它们位于最前面,则所有对话框都需要有一个父组件。

  • 当我将应用程序(JFrame)传递到超级构造函数而不是传递“parent”时,此解决方案对我有用。谢谢!

  • nop 也没有起到作用,我开始认为是 netbeans 造成了这个问题。不过还是谢谢你

  • 我不确定你的问题实际上是什么(可能是你的 Netbeans......谁知道呢),但是你尝试过覆盖该 createDialog 方法吗?

    例子:

    JFileChooser fc = new JFileChooser() {
       @Override
       protected JDialog createDialog(Component parent) throws HeadlessException {
           // intercept the dialog created by JFileChooser
           JDialog dialog = super.createDialog(parent);
           dialog.setModal(true);  // set modality (or setModalityType)
           return dialog;
       }
    };
    

    这仅仅是一个黑客解决方案,通常您不需要这样做。

  • 没问题;我已相应简化了示例。早期版本仍可访问:.com/posts/5129757/revisions

  • 我感谢你的努力和帮助 trashgod。但是就像我之前说的,其他一些(解决方案)对于我目前的水平来说似乎非常冗长和复杂。起初我以为这是我这边的一个直接错误,但现在我意识到它比我想象的要复杂一些,而且由于它不是必须的,因此它只会在我的测试过程中对我有益,我想我现在会把它放在一边,专注于功能。再次感谢,当时间不是限制因素时,我一定会尝试你的建议。

  • 的 API showOpenDialog() 引用 showDialog() ,其含义是,“如果父级是 null ,则对话框不依赖于任何可见窗口,并且它被放置在与外观相关的位置,例如屏幕的中心”。

    下面的示例将选择器放置在我的 L&F 屏幕的中心。您可能会看到它与您的相比如何。

    package gui;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.KeyStroke;
    
    /**
     * @see http://.com/questions/8507521
     * @see http://.com/questions/5129294
     */
    public class ImageApp extends JPanel {
    
        private static final int MASK =
            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
        private JFileChooser chooser = new JFileChooser();
        private Action openAction = new ImageOpenAction("Open");
        private Action clearAction = new ClearAction("Clear");
        private JPopupMenu popup = new JPopupMenu();
        private BufferedImage image;
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new ImageApp().create();
                }
            });
        }
    
        public void create() {
            JFrame f = new JFrame();
            f.setTitle("Title");
            f.add(new JScrollPane(this), BorderLayout.CENTER);
            JMenuBar menuBar = new JMenuBar();
            JMenu menu = new JMenu("File");
            menu.setMnemonic('F');
            menu.add(new JMenuItem(openAction));
            menu.add(new JMenuItem(clearAction));
            menuBar.add(menu);
            f.setJMenuBar(menuBar);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.pack();
            f.setSize(new Dimension(640, 480));
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public ImageApp() {
            this.setComponentPopupMenu(popup);
            popup.add("Popup Menu");
            popup.add(new JMenuItem(openAction));
            popup.add(new JMenuItem(clearAction));
        }
    
        @Override
        public Dimension getPreferredSize() {
            if (image == null) {
                return new Dimension();
            } else {
                return new Dimension(image.getWidth(), image.getHeight());
            }
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, null);
        }
    
        private class ClearAction extends AbstractAction {
    
            public ClearAction(String name) {
                super(name);
                this.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_C);
                this.putValue(Action.ACCELERATOR_KEY,
                    KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK));
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                image = null;
                revalidate();
                repaint();
            }
        }
    
        private class ImageOpenAction extends AbstractAction {
    
            public ImageOpenAction(String name) {
                super(name);
                this.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_O);
                this.putValue(Action.ACCELERATOR_KEY,
                    KeyStroke.getKeyStroke(KeyEvent.VK_O, MASK));
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                int returnVal = chooser.showOpenDialog(chooser);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File f = chooser.getSelectedFile();
                    try {
                        image = ImageIO.read(f);
                        revalidate();
                        repaint();
                    } catch (IOException ex) {
                        ex.printStackTrace(System.err);
                    }
                }
            }
        }
    }
    
  • 其实不是,这是整个程序中唯一使用 UI 的方法,其余的仍然是纯控制台。关于导入,我只使用

  • 引用 11

    您不应该做任何这些事情。我想知道这是否是代码中其他地方的原因。例如,您是否将 AWT 组件与 Swing 组件混合在一起?

返回
作者最近主题: