首页 > 解决方案 > Java 方法没有在 Matlab 中正确运行?

问题描述

我正在使用用Matlab 2018编写的Level 2 S 函数来处理来自Simulink模型的输入。根据该输入,图像(使用 Swing 制作)在屏幕上移动。

例如,“10”使其向左移动,“01”向右移动。

我使用Java 1.8创建了一个Game类来处理图像移动。我需要将数据传递给 Java 对象的实例,因此我在类中创建了一个方法来获取输入值并在屏幕上移动图像,称为getMdlValues. moveDiver是 Matlab 中用来调用的公共方法getMdlValues

我在 S 函数的函数中创建对象,并在函数中使用andStart抓取它。然后我尝试 通过. 但是,屏幕上什么也没有发生。即使我在方法中放入的打印语句正在执行,图像也不会移动。Updateset_paramget_paramgetMdlValuesmoveDiver

部分 Matlab 代码供参考:

function Start(block)

    gameObj = javaObject('frenchToast.lafayette.edu.Game'); % object 

    set_param(block.BlockHandle,'UserData',gameObj);
    %javaMethodEDT('main',gameObj,""); %test
    gameObj.main("");

%end Start

function Update(block)


    gameObj = get_param(block.BlockHandle,'UserData'); %get object

    javaMethod('moveDiver',gameObj, 1,0); %move image to the left

%end Update

我试过了javaObjectEDTjavaMethodEDT但它们没有用——图像没有移动。也许我必须制作一个 Runnable?我没有尝试过,我不知道该怎么做。我已经验证了getMdlValues在 Matlab 中不调用该方法时该方法有效(我在 Eclipse 中运行了该类,该方法移动了潜水员的图像)。在 Matlab 中,我将它传递给“10”,然后将“left”打印到窗口。所以它运行代码但它不会更新我的图像的位置。为什么?Matlab 不能在我的 Game 类中操作 Swing 对象吗?

Game.class 中的部分代码:

//create scuba diver image
        scuba = new JLabel("");
        scuba.setIcon(new ImageIcon("C:\\Users\\frenchToast\\Downloads\\scuba75.png"));
        scuba.setBounds(285, 537, 75, 44);
        panel.add(scuba);

很久以后的代码:

public void moveDiver(boolean left, boolean right) {

        getMdlValues(left,right);
}


private void getMdlValues(boolean left, boolean right) { //used to analyze values from Simulink 

        System.out.println("testing getMdlValues");

        if(!chestDirection.equals("")){ //don't do anything unless start menu has been closed

            if(left == true && right == false) { //left
                scuba.setLocation(scuba.getX() - 5, scuba.getY());
                System.out.println("left");
            }

            else if(left == false && right == true) { //right
                scuba.setLocation(scuba.getX() + 5, scuba.getY());
                System.out.println("right");
            }

            else {
                System.out.println("Left and Right values unable to be determined or do not move"); 
            }

            checkScored(); //see if scuba diver found the treasure
        }
}

我真的很感激任何时间和帮助!如果您需要更多(或更少)细节,请告诉我。

标签: javamatlabsimulink

解决方案


推荐阅读