Метод Java не работает правильно в Matlab? - PullRequest
1 голос
/ 02 апреля 2019

Я использую Функция уровня 2 S , написанную на Matlab 2018 для обработки ввода от Simulink модели.В зависимости от этого ввода изображение (созданное с помощью Swing) перемещается по экрану.

Например, , «10» перемещает его влево, а «01» вправо.

Я использовал Java 1.8 , чтобы создать Game класс для обработки движения изображения.Мне нужно передать данные в экземпляр объекта Java, поэтому я создал метод в классе, который принимает входные значения и перемещает изображение на экране, которое называется getMdlValues.moveDiver - это открытый метод, используемый в Matlab для вызова getMdlValues.

. Я создаю объект в функции Start функции S и захватываю его в функции Update, используя set_param и * 1024.*.Затем я пытаюсь позвонить getMdlValues через moveDiver.Однако на экране ничего не происходит.Изображение не перемещается, даже если выполняются операторы print, которые я вставил в метод.

Часть кода 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

Я пробовал javaObjectEDT и javaMethodEDT, но они не работали - изображение не двигалось.Возможно, я должен сделать Runnable?Я этого не пробовал и не знаю как.Я убедился, что метод getMdlValues работает, когда он не вызывается в Matlab (я запустил класс в Eclipse, и метод переместил изображение дайвера).В Matlab я передал его «10», и он напечатал «ушел» в окно.Таким образом, он запускает код, но не обновляет положение моего изображения.Зачем?Может ли Matlab не манипулировать объектами Swing в моем классе Game?

Частичный код в 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
        }
}

Я действительноценить любое время и помощь!Пожалуйста, дайте мне знать, если вам нужно больше (или меньше) деталей.

...