当前位置: 首页 > 面试题库 >

Java将JFileChooser置于所有窗口之上

隆钊
2023-03-14
问题内容

我对文件选择器对话框的非常简单的实现似乎有一个问题,该问题要求我每次都尽量减少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();

我可以设置特定的属性/方法来解决问题吗?


问题答案:

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://stackoverflow.com/questions/8507521
 * @see http://stackoverflow.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);
                }
            }
        }
    }
}


 类似资料:
  • 问题内容: 我将Python 2与和一起使用,然后使用。 该程序运行良好,但是每次打开该程序时,窗口都会显示为隐藏状态,因此,直到我单击扩展坞上的图标以将其打开时,该窗口才会出现。 有什么方法可以控制此,使该窗口位于应用程序启动时打开的其他窗口之上? 需要澄清的是,在应用程序运行的整个过程中,它不一定都位于最前面。我只需要它在启动时位于其他窗口之上。 问题答案: 如果我接受您提供的代码并添加第一行

  • 问题内容: 我想阻止所有者窗口中的JavaFX弹出窗口。 我这样初始化弹出窗口: 这样,我仍然可以在第一个窗口(窗格窗口)中工作。我想禁用此操作,并且希望用户仅在弹出窗口中工作。 这该怎么做 ? 谢谢。 问题答案: 使用舞台而不是弹出窗口。 在显示该阶段之前,请根据需要将stage.initModality调用为APPLICATION_MODAL或WINDOW_MODAL。还要将stage.ini

  • 问题内容: 我一直在阅读,发现Java Swing无法在没有可怕的闪烁效果的情况下停留在全屏应用程序之上。这是真的?闪烁效果:我有一个线程,每200毫秒将frame.setAlwaysOnTop()更新为true。 如果是这样,我正在寻找方法的替代方法,并且正在阅读有关C / C ++ / C#的SetWindowsPos的信息,那么这似乎会对我有用。但是,在重写程序之前,我想知道是否可以将程序保

  • 我写了一个小GUI程序与python在tkinter的窗口。我的窗口必须在全屏游戏窗口的前面。 此刻,我用这句话: 它适用于普通窗口(浏览器,浏览器,...),但如果我启动游戏到全屏模式,我的窗口隐藏在游戏后面。 为什么会发生这种情况?调用游戏可能类似于覆盖我的属性的? 我的问题还有别的解决办法吗?也许可以告诉windows,我的窗口应该在特定窗口(游戏窗口)的前面?

  • 我正在尝试使用主题列表中的单个kafka使用者组合两个kafka主题,进一步将流中的json字符串转换为POJO。然后,通过keyBy(On事件时间字段)将它们加入,并将它们合并为单个胖json,我计划使用窗口流并在窗口流上应用窗口函数。假设主题A 我有几个问题。 这种方法适合合并主题并创建单个JSON吗 所有窗口流上的窗口函数似乎工作不正常;任何指点都将不胜感激 代码片段: 我得到了- AllW

  • 主要内容:1 Java JFileChooser的介绍,2 Java JFileChooser的声明,3 Java JFileChooser的构造方法,4 Java JFileChooser的案例1 Java JFileChooser的介绍 JFileChooser类的对象表示一个对话框,用户可以从中选择文件。它继承了JComponent类。 2 Java JFileChooser的声明 我们来看一下javax.swing.JFileChooser类的声明。 3 Java JFileChoose