将JFileChooser置于所有窗口之上
我似乎遇到了一个问题,就是我非常简单地实现了一个文件select器对话框,这个对话框要求我每次最小化Netbeans以实现它,现在特别是在testing的时候,它变得非常令人沮丧。
我已经在网上看到了一些包括SO的解决scheme,但似乎没有一个能够做到这一点,而另外一些解决scheme对于我目前的水平来说似乎非常冗长和复杂。
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();
是否有一个特定的属性/方法可以解决这个问题?
showOpenDialog()
的API引用了showDialog()
,它表示:“如果父对象为null
,则对话框不依赖于可见窗口,而是放置在与外观相关的位置,例如屏幕。”
下面的示例将select器放置在我的L&F屏幕中央。 你可能会看到它与你的比较。
包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); } } } } }
我不知道你的问题实际上是什么(这可能是你的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; } };
这只是一个黑客解决scheme,你不需要这样做通常。
fileSelect.showOpenDialog(this)
当然, this
必须是某种组件(主界面的JFrame或JPanel)。 如果你希望他们走到前面,所有的对话框都需要有一个父组件。