【问题标题】:troubles with displaying image in window在窗口中显示图像的问题
【发布时间】:2012-04-09 00:25:59
【问题描述】:

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

我创建了使用 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);
}

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 另一个问题是在我更改窗口大小之前它什么都不显示。

【问题讨论】:

  • setVisible()/setSize() 这样的事情必须在最后出现,一旦你将东西添加到你的容器中。把这些东西放在构造函数的最后,为了让mainFrame.setJMenuBar(...)之后的事情顺利进行,setVisible(true)必须在最后,在你添加完所有东西之后。如果你不知道,最好再试一试 Swing 的教程。

标签: java swing


【解决方案1】:

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

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

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

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

【讨论】:

  • 最好在JScrollPane 中简单地使用JLabel 来显示图像。无需覆盖任何内容,如果图像对于指定区域的大小而言太大,滚动条将自动出现。
【解决方案2】:

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

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

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

正如 Max 指出的,你应该重写paintComponent 而不是paint:

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

【讨论】:

  • “你应该覆盖paintComponent 而不是paint:” 你还应该使用ImageObserver,如果一个可用的话。在组件中绘制时将null 替换为this,您就有了。
猜你喜欢
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多