在窗口中显示图像的麻烦

时间:2012-04-08 15:55:27

标签: java swing

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

我创建了用jmenubar和1 jmenuitem创建窗口的类。当我点击menuitem出现JfileChooser然后我选择了一些文件。但后来什么也没发生。 我认为问题出在ActionListener for JFileChooser(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);
}

ShowImage类

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

P.S另一个问题是,在我改变窗口大小之前它没有显示任何内容。

2 个答案:

答案 0 :(得分:2)

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

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

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

final int returnval = choser.showOpenDialog(menubar);
if (returnval == JFileChooser.APPROVE_OPTION){
    ...
}

答案 1 :(得分:2)

我很确定这一行会引起问题:

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

getName()将返回文件的名称。因此,例如,如果您选择带有名为image.jpg的JFileChooser的图像,则getName将返回“image.jpg”。这将使图像仅在您选择的文件存储在项目的根文件夹中时显示。我会将getName()更改为getAbsoultePath(),这将返回完整的补丁(e.i c:\ desktop \ image.jpg),这是您最想要的。

同样在Max指出的情况下,你应该覆盖paintComponent,而不是绘制:

protected void paintComponent(Graphics g){     
   g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null); 
}