java - ImageView 仅显示循环中的最后一张图像

标签 java opencv javafx

您好,我正在做的是,我正在从客户端接收图像并在循环中显示它..数据已正确接收,但循环完成时仅显示最后接收的图像..

这不是线程中的主 Controller 。我不知道出了什么问题,因为它正在接收数据并且它应该在每次迭代时更新......

这里是代码:

@FXML  ImageView currentframe;
public void run()
{
        System.out.println("hi controller");  
        System.out.println("creating socket");
        DatagramSocket serverSocket=null; 
        try {
            serverSocket = new  DatagramSocket(1001);
        } catch (SocketException ex) {
            Logger.getLogger(threadclass.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("created socket");

        byte[] receiveData = new byte[50000]; 

        //byte[] sendData  = new byte[1024]; 
        //BufferedImage img = null;
        //Image image = null;

        int counter = 0;

        while(counter<20){
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
            try {  
                serverSocket.receive(receivePacket);
            } catch (IOException ex) {
                Logger.getLogger(threadclass.class.getName()).log(Level.SEVERE, null, ex);
            }
            //System.out.println("packetreceive");
            BufferedImage img = null;

            try {
                img = ImageIO.read(new ByteArrayInputStream(receivePacket.getData()));
            } catch (IOException ex) {
                Logger.getLogger(threadclass.class.getName()).log(Level.SEVERE, null, ex);
            }

            //System.out.println("packetreceive1");
            System.out.println("received packet length "+receivePacket.getLength());

            Image image= SwingFXUtils.toFXImage(img, null); 

            Image tempImg = image;

            Platform.runLater(() -> currentframe.setImage(tempImg));


            /*
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(threadclass.class.getName()).log(Level.SEVERE, null, ex);
            }*/

            //currentframe.setImage(image);
            //threadclass t = new threadclass(currentframe, image);
            //t.start();

           //Platform.runLater(null);

            counter++;
            System.out.println("IMAGE SET ON FRAME...");
        }
        //System.out.println("ssdcd" );
        // currentframe.setImage(image);
        //System.out.println("last packet ");
}

这是我在 Controller 中启动线程的方式:

@FXML
public void btn(ActionEvent event) throws IOException, InterruptedException
{
        threadclass t = new threadclass(currentframe);
        t.run();
    }

最佳答案

调用

t.run();

仅调用当前线程(可能是 FX 应用程序线程)上的 run() 方法。要启动一个新线程,您需要调用

t.start();

假设threadclass(原文如此)是Thread的子类。

关于java - ImageView 仅显示循环中的最后一张图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47417877/

相关文章:

javafx - 使用自定义 asString 方法将 simpleStringProperty 绑定(bind)到 simpleIntegerProperty

java - TextArea Swing与JavaFX选择范围区别

java - Java 的已检查异常处理是否已损坏?

java - 用递归计算自然数的位数

python - 使用 GSOC 进行 openCV 背景扣除

Python OpenCV VideoCapture read() 无法读取帧

python - OpenCV:调整大小窗口不起作用

java - 查找文件夹列表中的最后一个文件夹

java - JTextArea setFont 改变textarea的大小

JavaFX TableView 未立即更新