2012-04-08 79 views
2

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

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

PS的另一个问题是,它说明不了什么,直到我改变窗口的大小。

+1

'调用setVisible()/的setSize()'这样的事情一定要来在最后,一旦你已经添加的东西到你的容器。把这些东西放在构造函数的末尾,在mainFrame.setJMenuBar(...)','setVisible(true)'必须在最后添加所有内容后才能顺利工作。如果你不知道更好地尝试再次浏览Swing的教程一段时间。 – 2012-04-08 16:50:15

回答

2

扩展JPanel代替Panel,并覆盖paintComponent方法,即:

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

而且,也没有必要addActionListenerJFileChooser,只是检查返回值,并采取相应的行动,即:

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

在“JScrollPane”中简单地使用JLabel来显示图像会更好。无需重写任何内容,如果图像对于指定区域的大小太大,滚动条会自动出现。 – 2012-04-08 17:39:34

2

我很肯定这条线会造成问题:

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

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

另外,作为最大指出,你应该重写paintComponent而不是油漆:

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

*“你应该重写paintComponent而不是paint:”*当你有一个可用的时候,你也应该使用'ImageObserver'。当在组件中绘画时,为'this'交换'null',并且你有一个。 – 2012-04-08 17:41:40