Как обновить изображение в JFrame? - PullRequest
0 голосов
/ 29 августа 2018

Есть какой-то сервер, и мне нужно получить изображение с него. И это изображение обновляется иногда. И программе нужно получить это изображение и показывать его на экране всегда в полноэкранном режиме. Я написал некоторый код, и он работает нормально, если запустить его один раз. Но я не могу справиться с обновлением изображения. Мне нужно получать изображение каждые XX минут или секунд с сервера и показывать его на экране. Может быть, мне нужна функция обновления изображения, например - repaint (), но я не знаю, как правильно использовать ее в этом коде. Я пробовал цикл - while и Thread.sleep (), но он не работал должным образом из-за создания большого количества обработанных объектов ... Помогите мне, пожалуйста.

public class MyParser {
public static void main(String[] args) throws IOException, InterruptedException {
            String urlStr = "http://192.168.11.111/images/SGBWebServerImage.bmp";
            JFrame frame = new JFrame();
            URL url = new URL(urlStr);
            BufferedImage image = resize(ImageIO.read(url), 320, 1920);
            ImageIcon icon = new ImageIcon(image);
            frame.add(new JLabel(icon));
            frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setBackground(Color.BLACK);
            frame.pack();
            frame.setVisible(true);
    }

private static BufferedImage resize(BufferedImage img, int height, int width) {
    Image tmp = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    BufferedImage resized = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    Graphics2D g2d = resized.createGraphics();
    g2d.drawImage(tmp, 0, 0, null);
    g2d.dispose();
    return resized;
}

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Проверьте, помогает ли это.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MyImage extends JPanel implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    JLabel imageLabel;

    public MyImage() {

        ImageIcon icon = new ImageIcon("https://picsum.photos/200/300/?random");
        setLayout(new BorderLayout());
        imageLabel = new JLabel(icon);
        add(imageLabel, BorderLayout.CENTER);
        javax.swing.Timer timer = new javax.swing.Timer(1000, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    String imageName = "https://picsum.photos/200/300/?random";
                    URL url = new URL(imageName);
                    ImageIcon icon = new ImageIcon(url);
                    icon.getImage().flush();
                    imageLabel.setIcon(icon);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("testimage reload");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new MyImage());
        frame.setLocationByPlatform(true);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}
0 голосов
/ 29 августа 2018

Мне нужно получать изображение каждые XX минут или секунд с сервера и показывать его на экране.

Используйте Swing Timer, чтобы запланировать некоторые действия. Прочитайте раздел из учебника по Swing на Как использовать Swing Timers для получения дополнительной информации.

Когда таймер срабатывает, вам нужно:

  1. получить изображение с сервера
  2. обновить иконку JLabel

Это означает, что вам нужно будет реструктурировать свой код, чтобы иметь ссылку на метку Поэтому вам нужно избавиться от всех статических методов.

Вы можете проверить: Нет задержки при выполнении графического интерфейса даже после реализации режима сна в отдельном потоке для примера. Вам просто нужно заменить логику в методе actionPerformed(...), чтобы получить изображение и обновить значок метки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...