Я использую Функция уровня 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
}
}
Я действительноценить любое время и помощь!Пожалуйста, дайте мне знать, если вам нужно больше (или меньше) деталей.