2

我需要选择带有文件打开对话框的图像,然后在窗口中显示它。但是当我选择图像时,它不会显示在窗口中。

我创建了使用 jmenubar 和 1 个 jmenuitem 创建窗口的类。当我点击 menuitem JfileChooser 出现然后我选择一些文件。但随后什么也没有发生。我认为问题出在 JFileChooser 的 actionListener 中(ImageFilter 是来自 docs java 的过滤器)

public Frame(){
    //create bars and window
    mainframe = new JFrame("Window");
    mainframe.setVisible(true);
    mainframe.setSize(300, 300);
    menubar = new JMenuBar();
    mainer = new JMenu("Menu");
    menubar.add(mainer);
    //create items
    item = new JMenuItem("Open",KeyEvent.VK_T);
    item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK));
    item.getAccessibleContext().setAccessibleDescription("open image");
    //action listener
    item.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //open file dialog
                    choser = new JFileChooser();
                    choser.addChoosableFileFilter(new ImageFilter());
                    final int returnval = choser.showOpenDialog(menubar);
                    //action listener for JFileChooser
                    choser.addActionListener(
                            new ActionListener() {
                                @Override
                                public void actionPerformed(ActionEvent e) {
                                    if (returnval == JFileChooser.APPROVE_OPTION){
                                        fc = choser.getSelectedFile();
                                        try{
                                            Panel panel = new ShowImage(fc.getName());
                                            mainframe.getContentPane().add(panel);
                                        }catch(Exception exc){};
                                    }
                                }
                            }
                    );
                }
            }
    );
    mainer.add(item);
    mainframe.setJMenuBar(menubar);
}

显示图像类

class ShowImage extends Panel{
    BufferedImage image;
    public ShowImage(String imagename) throws IOException {
        File input = new File(imagename);
        image = ImageIO.read(input);
    }
    public void paint(Graphics g){
        g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null);
    }
}

PS 另一个问题是在我更改窗口大小之前它什么都不显示。

4

2 回答 2

2

扩展JPanel而不是Panel, 并覆盖paintComponent方法,即:

class ShowImage extends JPanel{
    public void paintComponent(Graphics g){
        ...
    }
}

此外,不需要addActionListeneron JFileChooser,只需检查返回值并采取相应措施,即:

final int returnval = choser.showOpenDialog(menubar);
if (returnval == JFileChooser.APPROVE_OPTION){
    ...
}
于 2012-04-08T16:17:57.933 回答
2

我很确定这条线会导致问题:

Panel panel = new ShowImage(fc.getName()); 

getName() 将返回文件的名称。例如,如果您选择一个名为 image.jpg 的 JFileChooser 图像,getName 将返回“image.jpg”。这将使图像仅在您选择的文件存储在项目的根文件夹中时显示。我会更改getName()getAbsoultePath()哪个将返回完整的补丁(ei c:\desktop\image.jpg),这很可能是你想要的。

同样正如 Max 指出的那样,您应该覆盖paintComponent 而不是绘制:

protected void paintComponent(Graphics g){     
   g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null); 
}
于 2012-04-08T16:25:59.237 回答