Задать вопрос
@KeLaTy
C++ Developer

Не работает код на JavaFX?

Приложение запускается, но при нажатии стрелки вверх ничего не происходит.
Код:
package sample;

import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.FlowPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

import java.io.IOException;

public class Main extends Application {
    private FlowPane pane;
    private Scene scene;
    private Stage stage;

    @FXML
    private Circle crc;

    @Override
    public void start(Stage stage) throws Exception{
        this.stage = stage;
        try {
            pane = (FlowPane) FXMLLoader.load(Main.class.getResource("sample.fxml"));
        } catch (IOException e){
            e.printStackTrace();
        }
        stage.setTitle("Hello World");
        scene = new Scene(pane,600,600);
        stage.setScene(scene);
        stage.show();
    }


    public static void main(String[] args) {

        launch(args);
    }

    @FXML
    public void initialize(){
        crc.setOnKeyTyped(event -> {
            if (event.getCode() == KeyCode.UP){
                crc.setFill(Color.RED);
            }
        });
    }

}


FXML:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.FlowPane?>
<?import javafx.scene.shape.Circle?>

<FlowPane fx:controller="sample.Main" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.92" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Circle fx:id="crc" fill="DODGERBLUE" radius="25.0" stroke="BLACK" strokeType="INSIDE" />
   </children>
</FlowPane>
  • Вопрос задан
  • 1250 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
MrJcnby
@MrJcnby
Наверное вы делали эти в качестве пробы javaFX. Тем не менее пару советов :
Во первых: архитектура в корне не правильная - не вешайте на main класс ничего что связано с элементами формы. Гораздо правильнее сделать новый контроллер для sample.fxml - и естественно сделать его заимплементить его на инициализацию (implements Initializable) - тогда метод initialize будет вызываться при загрузке.
Во вторых: чтобы тупо заработало : в конце метода public void start добавте
pane.getScene().setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.UP){
                System.out.println("2");
            }
        });
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
У вас по идее вообще не заработает т.к. Circle crc вообще не относится к форме.
Чтобы заработало надо сначала в конструкторе создать экземпляр Circle, а потом сделать pane.getChildren().add(crc) после чего Circle добавится на пано.
Вообще рекомендую для случаев взаимодействия через FXML использовать контроллеры.
В билдере форм рисуете форму и там есть волшебная кнопка которая сгенерирует сразу валидный код контроллера который просто надо скопипастить в любимую IDE.
Рекомендую вот этот пример посмотреть чтобы понять как контроллеры работают и как можно события через яваскрипты ловить и CSS стили прикручивать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы