Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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_Jframe_Jlabel - Fatal编程技术网

Java 重新加载同一标签中的图像(不创建任何新标签)

Java 重新加载同一标签中的图像(不创建任何新标签),java,swing,jframe,jlabel,Java,Swing,Jframe,Jlabel,我有一个代码,将显示从本地客户端获得的图像。它在不同的时间得到不同的图像。因此,我希望在每次刷新时都在同一标签中逐个显示所有图像。 下面的代码将在每次接收对象时生成新标签。如何修改以获得所需的输出 // For each connection it will generate a new label. public void received(Connection connection, Object object) { if (object instanceof Picture

我有一个代码,将显示从本地客户端获得的图像。它在不同的时间得到不同的图像。因此,我希望在每次刷新时都在同一标签中逐个显示所有图像。 下面的代码将在每次接收对象时生成新标签。如何修改以获得所需的输出

// For each connection it will generate a new label.   

public void received(Connection connection, Object object) {
    if (object instanceof Picture) {

        Picture request = (Picture) object;
        try {
            System.out.println(request.buff.length);
            InputStream in = new ByteArrayInputStream(request.buff);
            BufferedImage image = ImageIO.read(in);
            JFrame frame = new JFrame("caption");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Dimension dimension = new Dimension(image.getWidth(), image.getHeight());

            JLabel label = new JLabel(new ImageIcon(image)); //displays image got from each connection
            JScrollPane pane = new JScrollPane(label, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
            frame.getContentPane().add(pane);
            frame.setSize(dimension);
            frame.setVisible(true);
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex);
        }
    }
}

每次代码不仅会生成新的
JLabel
,还会生成新的
JFrame
、新的
JScrollPane

将代码分为两种方法
init
receive
init
将仅在开始时执行,并将创建所有“环绕”,而
receive
将更新图像

基本示例:

JFrame frame;
JLabel label;
JScrollPane pane;
// ...  
public void init() {
    frame = new JFrame("caption");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Dimension dimension = new Dimension(someDefaultHeight, someDefaultWidth);
    label = new JLabel(); //displays image got from each connection
    JScrollPane pane = new JScrollPane(label, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    frame.getContentPane().add(pane);
    frame.setSize(dimension);
    frame.setVisible(true);
}


public void received(Connection connection, Object object) {
    if (object instanceof Picture) {
        Picture request = (Picture) object;
        try {
            System.out.println(request.buff.length);
            InputStream in = new ByteArrayInputStream(request.buff);
            BufferedImage image = ImageIO.read(in);
            Dimension dimension = new Dimension(image.getWidth(), image.getHeight());
            label.removeAll();
            label.setIcon(new ImageIcon(image));
            frame.setSize(dimension);
            label.revalidate();
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex);
        }
    }
}

我想您可以在同一个实例上使用相同的
JLabel
并调用
setIcon
方法。您还应该重用相同的
JFrame
JScrollPane

因此,您应该在一个单独的方法中初始化它们,并在收到新对象时只调用
setIcon
方法。

@mre-您是对的,但我的目的是尽可能少地更改代码。此代码每次也将创建一个新的
JFrame