Перезагрузите изображения в том же ярлыке (без создания новых) - PullRequest
0 голосов
/ 05 августа 2011

У меня есть код, который покажет изображение, полученное от локального клиента. Он получает разные изображения в разное время. Следовательно, я хочу показать все изображения по одному в одной и той же метке, обновляя каждый раз. Приведенный ниже код будет генерировать новую метку при каждом получении объекта. Как я могу изменить так, чтобы я получал вывод, как я хочу?

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

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Полагаю, вы можете использовать тот же JLabel и вызывать метод setIcon в том же экземпляре.Вы также должны повторно использовать те же JFrame и JScrollPane.Поэтому вы должны инициализировать их в отдельном методе и вызывать только метод setIcon при получении нового объекта.

0 голосов
/ 05 августа 2011

Код будет генерировать не только новый 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);
        }
    }
}
...