Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这种显示图像的方法有什么问题?_Java_Swing_Methods_Graphics_Jlabel - Fatal编程技术网

Java 这种显示图像的方法有什么问题?

Java 这种显示图像的方法有什么问题?,java,swing,methods,graphics,jlabel,Java,Swing,Methods,Graphics,Jlabel,我很困惑。为什么此方法不适用于显示图像: private void showImage(final BufferedImage image){ SwingUtilities.invokeLater( new Runnable(){ @Override public void run(){ ImageIcon icon = new ImageIcon(image);

我很困惑。为什么此方法不适用于显示图像:

private void showImage(final BufferedImage image){
    SwingUtilities.invokeLater(
        new Runnable(){

            @Override
            public void run(){
                ImageIcon icon = new ImageIcon(image);
                JLabel label = new JLabel();
                label.setIcon(icon);
                add(label, BorderLayout.CENTER);
            }
        }
    );
}
我的类扩展了
JFrame
,这就是为什么我没有这样做的原因:

frame.add(label);
我很困惑。我尝试过这个方法,但没有使用整个
SwingUtilities
功能,我也尝试过
label.setVisible(true)
我到底做错了什么?当我运行它时,我知道这个方法是用一个完全正常的
BufferedImage
调用的(我让它在方法中输出了一些东西)。我希望一个
JLabel
会出现我的图像,但只出现了JFrame,看不到图像

add(label, BorderLayout.CENTER);
从可见GUI添加(或删除)组件时,基本代码为:

panel.add(...);
panel.revalidate();
panel.repaint();
在本例中,由于要将标签添加到框架的内容窗格中,因此需要修改框架

也就是说,您需要调用布局管理器,否则组件的大小为(0,0),因此无需绘制任何内容

但是,更好的解决方案可能是在创建框架时将标签添加到GUI中

然后,要更改图标,只需执行以下操作:

label.setIcon(...);

无需每次更改图像时都创建新的JLabel。

这一点很不清楚。张贴一个完整的,最小的例子再现问题。告诉我们您希望它做什么,以及它会做什么。是否需要重新验证()和重新绘制()?我从未见过标准JComponents需要它们的情况。我只是使用了
JDialogPane.showMessageDialog
,它确实做到了我想要的,但仍然感谢您的帮助。您的修复听起来像是一个解决办法。我会选择上面描述的“更好的解决方案”。使用它,我们甚至可以设置WxH的初始透明图像作为关于最小大小的提示。这在打包顶级容器(JFrame)时非常有用。@VGR“标准”组件,如
JTextField
/
JButton
等,在内部发布此类事件。但是,当您更改容器的布局(通过添加或删除组件)时,您需要这样做,因为容器在更新时是惰性的,这是一件好事,因为您不希望在运行时添加/删除多个组件时浪费时间