我对文件选择器对话框的非常简单的实现似乎有一个问题,该问题要求我每次都尽量减少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,则对话框不依赖可见窗口,并且放置在与外观相关的位置,例如屏幕的中心。”
API showOpenDialog()
showDialog()
下面的示例将选择器放置在L&F的屏幕中央。你可能会看到它与你的相比。
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); } } } } }