Помощь javafx нубу, гейдев

NDel

Новый пользователь
Дней с нами
6
Розыгрыши
0
Сообщения
1
Репутация
0
Реакции
0
новис в яве, чуть больше чем нубло, пишу игрушку на фыксах, решил проработать управление на тестовом стенде в новом классе, просто заморочился и вывел это все в отдельный класс и сделать как можно оптимальней не внося код в scene event, увы в фыксах нет кей лисенера для подобных задач
Java:
package com.myproject;


import javafx.scene.image.ImageView;

import javafx.scene.input.KeyCode;

import javafx.scene.input.KeyEvent;


import java.util.Set;

import java.util.TreeSet;



public class Controller {

   public static double speed = 10;

   static double[] setcoord = new double[2];

   static double retcoord;

   boolean dead = true;

   {

       setcoord[0] = 0;

       setcoord[1] = 0;


   }

   public double Controller(KeyEvent keyEvent, double x, double y, String s, char wh) {


       System.out.println(keyEvent);

       keybuffer.setPressedKeys(keyEvent.getCode());


       Thread ru = new Thread(new Runnable() {

           @Override

           public void run() {


           synchronized (setcoord) {

               class upper {

                   void setter() {

                       if (keybuffer.pressedKeys.contains(keyEvent.getCode())) {

                           System.out.println(wh);

                           switch (s) {

                               case "x":

                                   setcoord[0] = x;

                                   System.out.println(setcoord[0]);

                                   System.out.println(setcoord);

                                   switch (wh) {

                                       case '-':

                                           setcoord[0] -= speed;

                                           retcoord = setcoord[0];

                                           break;

                                       case '+':

                                           retcoord = setcoord[0] += speed;

                                           break;

                                   }

                                   break;

                               case "y":

                                   setcoord[1] = y;

                                   switch (wh) {

                                       case '-':

                                           setcoord[1] -= speed;

                                           retcoord = setcoord[1];

                                           break;

                                       case '+':

                                           retcoord = setcoord[1] += speed;

                                           break;

                                   }

                                   break;

                           }

                       }


                       upper up = new upper();

                       up.setter();

                   }


               }

           }



       }});

       ru.start();

       System.out.println(ru.getState());

       return retcoord;


   }



}

class keybuffer{

   static Set<KeyCode> pressedKeys = new TreeSet<>();

   public static void setPressedKeys(KeyCode keyCode) {

       pressedKeys.add(keyCode);

   }


   public static void remPressedKeys(KeyCode keyCode) {

       pressedKeys.remove(keyCode);

   }

}


в общем работа кода в представлении: нажимаешь пипку к примеру W, все что связано с image передается в класс контролер, там создается поток который отвечает за обработку нажатия W, даже скорее обработку массива TreeSet на наличие этой кнопки, и возвращает координаты которые присваиваются в image setY,

работа кода как оно работает сейчас: поток сразу после создания имеет статус терминейтед, метод контролер возвращает 0 при любом вызове ибо поток вырубается не делая никаких вычислений и метод его просто пропускает, картинка переходит к координатам 0 0. что здесь можно сделать, даже если поток в статусе ранед, он все равно ничего не делает, и опять возвращается 0
то что реалезованно в сцене в мейне
Java:
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
if(keyEvent.getCode().equals(KeyCode.S)) {
image.setY(Down.Controller(keyEvent, image.getX(), image.getY(), "y", '+'));
}
if(keyEvent.getCode().equals(KeyCode.W)) {
image.setY(Up.Controller(keyEvent, image.getX(), image.getY(), "y", '-'));
}
if(keyEvent.getCode().equals(KeyCode.D)) {
image.setX(Right.Controller(keyEvent, image.getX(), image.getY(), "x", '+'));
}
if(keyEvent.getCode().equals(KeyCode.A)) {
image.setX(Left.Controller(keyEvent, image.getX(), image.getY(), "x", '-'));
}
}
});
scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
keybuffer.remPressedKeys(keyEvent.getCode());
}
});
 
Гуглы сынок, гугли. А теперь чатгпт юзай... Совсем никудышный что-ли. Сидим кури ветки стаковерфлоу. На крайняк юзай дипсик, cod pilot

Вот что за три, секунды 4o выдало мне

Я ознакомился с темой на mipped.com, и вот что я могу посоветовать участнику, испытывающему трудности с JavaFX:
Общая стратегия:
  1. Разбейте задачу на более мелкие, управляемые части: Не пытайтесь решить все проблемы одновременно. Сосредоточьтесь на одной конкретной задаче, пока она не будет решена.
  2. Упростите код: Чем проще код, тем легче его отладить. Попробуйте создать минимальный воспроизводимый пример (minimal reproducible example - MRE), который демонстрирует проблему.
  3. Используйте отладчик (debugger): Отладчик позволяет пошагово выполнять код и проверять значения переменных, что очень полезно для поиска ошибок.
  4. Четко формулируйте вопросы: Чем более четко сформулирован вопрос, тем легче на него ответить. Предоставьте минимальный воспроизводимый пример кода, опишите, что ожидаете увидеть и что происходит на самом деле.
  5. Будьте терпеливы: Изучение новых технологий требует времени и усилий. Не расстраивайтесь, если что-то не получается сразу. Продолжайте учиться и экспериментировать.
Конкретные советы, основанные на теме на mipped.com:
  • Разберитесь с потоками (Threads) и JavaFX Application Thread: JavaFX имеет свой поток для обработки графического интерфейса (JavaFX Application Thread). Нельзя изменять UI-элементы из других потоков. Используйте Platform.runLater() для выполнения кода, который изменяет UI, в JavaFX Application Thread. Это ключевой момент.
  • Изучите Task и Service: Для выполнения длительных операций (например, сетевых запросов) используйте Task и Service. Они позволяют выполнять операции в фоновом потоке и безопасно обновлять UI через Platform.runLater().
  • Используйте ObservableList для данных, отображаемых в UI: Если вы хотите, чтобы изменения в данных автоматически отображались в UI, используйте ObservableList.
  • Изучите биндинги (Bindings): Биндинги позволяют связать свойства UI-элементов с данными. Это позволяет автоматически обновлять UI при изменении данных.
  • Не используйте Thread.sleep() в JavaFX Application Thread: Это заморозит UI.
  • Разберитесь с жизненным циклом JavaFX приложения: Понимание того, когда вызываются методы init() и start() в вашем приложении, поможет избежать многих проблем.
  • Используйте Scene Builder: Scene Builder - это визуальный редактор для создания UI в JavaFX. Он позволяет создавать UI без написания кода, а также генерирует FXML-файлы, которые можно загрузить в ваше приложение.
  • Разберитесь с XML
    • Поищите готовые библиотеки которые бы парсили код