Llevar JFileChooser encima de todas las ventanas

Parece que tengo un problema con mi implementación muy simple de un diálogo selector de archivos que me obliga a minimizar Netbeans cada vez para llegar a él, y se vuelve bastante frustrante, especialmente ahora con las pruebas.

He visto algunas soluciones en línea que incluyen SO, pero ninguna parece funcionar, mientras que otras parecen ser muy largas y complicadas para mi nivel actual.

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

Algunos de mis bashs incluyen usar;

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

¿Hay algún atributo / método particular que pueda establecer para resolver el problema?

La API para showOpenDialog() hace referencia a showDialog() , que dice: “Si el padre es null , entonces el diálogo no depende de ninguna ventana visible, y se coloca en una posición de ver y sentir dependiente, como el centro del pantalla.”

El siguiente ejemplo coloca el selector en el centro de la pantalla en mi L & F. Puede ver cómo se compara con el tuyo.

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

No estoy seguro de cuál es tu problema en realidad (probablemente sea tu Netbeans … quién sabe), pero ¿has intentado anular el método createDialog ?

Ejemplo:

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

Esto no es más que una solución de pirateo, no debería necesitar hacerlo normalmente.

 fileSelect.showOpenDialog(this) 

Por supuesto, this debe ser un Componente de algún tipo (el JFrame o JPanel de su interfaz principal). Todos los cuadros de diálogo deben tener un componente principal si desea que pasen al frente.