2017-02-11 18 views
0

Я довольно новичок в концепции MVC и JavaFX. В основном у меня есть игра, в которой есть простая анимация. Для лучшего понимания моей проблемы, вот аналогия:JavaFX (с FXML) MVC: использование модели Контроллер

Модель: model.java

public int fib(int n){ 
    ctrl.setLabelFib(n) 
    someWaitFunction(1000 ms); //Now I can see the changes 

    if (n <= 1) return n; 
    else return fibonacci(n-1) + fibonacci(n-2); 
} 

Контроллер: ctrl.java

Label lFib = new Label(); 
public void setLabelFib(int n){ 
    lFib.setText(n) 
} 

Вид: view.fxml

*Generate with Scene Builder* 

Но как я могу получить доступ к восстановительной функции контроллера? Или я делаю это совершенно неправильно?

+0

Я думаю, что это поможет или даже решение: HTTP: // stackoverflow.com/questions/40117925/javafx-many-static-fxml-controllers – GOXR3PLUS

+0

Модель не должна ссылаться ни на один e (ы) или контроллер (ы). –

ответ

0

В вас контроллер, который реализует Initializable, вы будете иметь @override method : initialize

В этом вы будете создавать свою модель:

model md = new model(); //depending of you constructor 

Для добавления вы контроллера в модель вы можете дать в Повсеместно конструктор:

//in initialize of controller 
model md = new model(this); 

И

//in you ctrl.java 
private ctrl control; 
public model(ctrl control){ 
    this.control = control 
} 

С этим вы будете в состоянии сделать:

public int fib(int n){ 
    control.setLabelFib(n) 
    Thread.sleep(1000); 

    if (n <= 1) return n; 
    else return fibonacci(n-1) + fibonacci(n-2); 
} 

Я пишу метод ждать также

Try и рассказать в комментариях, как это работает

+0

Это вроде сработало. Я использовал точки останова, чтобы увидеть, изменилась ли метка во время выполнения. Но только в конце возвращающей функции метка изменилась на нуль, что верно. – user3880174

+0

@ user3880174 Это «нормально» из-за Thread, модель не может актуализировать сцену в режиме реального времени, чтобы это сделать, Java создала «Task», которая запускается в новом потоке – azro

+0

. Таким образом, решение заключается в создании задачи. Но как я могу это сделать? – user3880174

1

Модели не должны иметь каких-либо ссылок на контроллер (ы) или на вид (ы). Вы должны сделать свойства модели наблюдаемыми, чтобы заинтересованные клиенты (контроллер или представление) могли наблюдать за ними и получать уведомления при их изменении.

Лучшим способом изменения пользовательского интерфейса в JavaFX является использование API анимации, например. a Timeline.

Так что вы можете сделать

private class FibonacciModel { 

    private final IntegerProperty currentValue = new SimpleIntegerProperty(1); 

    private int previous = 0 ; 

    public IntegerProperty currentValueProperty() { 
     return currentValue ; 
    } 

    public final int getCurrentValue() { 
     return currentValueProperty().get(); 
    } 

    public final void setCurrentValue(int value) { 
     currentValueProperty().set(value); 
    } 

    public void nextValue() { 
     int next = previous + getCurrentValue(); 
     previous = getCurrentValue(); 
     setCurrentValue(next); 
    } 
} 

И тогда ваш взгляд может сделать

public class FibonacciView extends VBox { 

    private final Label label ; 
    private final Button startButton ; 

    public FibonacciView(FibonacciModel model) { 
     label = new Label(); 
     label.textProperty().bind(model.currentValueProperty().asString()); 

     FibonacciController controller = new FibonacciController(model); 

     startButton = new Button("Start"); 
     startButton.setOnAction(e -> { 
      startButton.setDisable(true); 
      controller.animateNumbers(20) 
       .setOnFinished(event -> startButton.setDisable(false)); 
     }); 

     getChildren().add(label, startButton); 
    } 
} 

и

public class FibonacciController { 

    private final FibonacciModel model ; 

    public FibonacciController(FibonacciModel model) { 
     this.model = model ; 
    } 

    public Animation animateNumbers(int howMany) { 
     Timeline timeline = new Timeline(
      newKeyFrame(Duration.seconds(1), event -> model.nextValue()); 
     ); 
     timeline.setCycleCount(howMany); 
     timeline.play(); 
     return timeline ; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^