Как получить доступ к объекту родительского класса изнутри дочернего класса?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как получить доступ к объекту родительского класса изнутри дочернего класса?

Сообщение Anonymous »

Я пытаюсь следовать этому ответу, этому ответу здесь, при создании своего первого приложения JavaFX, и столкнулся с проблемой при передаче ссылки на dataModel дочернему контроллеру в моем MVC. Вот что я имею в виду:
У меня есть Main.java:

Код: Выделить всё

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;

public class Main extends Application {

@Override
public void start(Stage primaryStage) {

//Primary application loader
try {
DataModel dataModel = new DataModel();

BorderPane root = new BorderPane();

FXMLLoader uiLoader = new FXMLLoader(getClass().getResource("views/MainUI.fxml"));
root.setCenter(uiLoader.load());
UIController uiController = uiLoader.getController();

FXMLLoader counterLoader = new FXMLLoader(getClass().getResource("views/Tracker.fxml"));
root.setTop(counterLoader.load());
TrackerController trackerController = (TrackerController) counterLoader.getController();

uiController.initModel(dataModel);
trackerController.initModel(dataModel);

Scene scene = new Scene(root,400,400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();

} catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
launch(args);
}
}

TrackerController.java

Код: Выделить всё

package application;

import javafx.fxml.FXML;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;

public class TrackerController {

private DataModel dataModel;
private Counter counter;

@FXML
private Label countLabel;

@FXML
public StringProperty labelTextProp  = new SimpleStringProperty("Start clicking");

public void initModel(DataModel dataModel) {

if (this.dataModel != null) {
throw new IllegalStateException("Model can only be initialized once");
}
this.dataModel = dataModel;

counter = dataModel.getCounter();
//       System.out.println(counter.getTotal());

counter.getProperty().addListener((observable, oldValue, newValue) ->  {
labelTextProp.set("Click! " + newValue + " total clicks!");

System.out.println(labelTextProp.get());
});

//just a test
labelTextProp.addListener((observable, oldValue, newValue) ->  {
System.out.println("Changed: " + oldValue + " -> " + newValue);
});
}

}

UIController.java

Код: Выделить всё

package application;

public class UIController {

public DataModel dataModel;

public void initialize() {

}

public void initModel(DataModel dataModel) {
if (this.dataModel != null) {
throw new IllegalStateException("Model can only be initialized once");
}
this.dataModel = dataModel;

}

public DataModel getDataModel() {
return this.dataModel;
}

}

MainUI.fxml И контроллер, которому я пытаюсь передать DataModel

Код: Выделить всё

package application;

public class ClickerController {

public DataModel dataModel;

public void initialize() {
}

//  public void initModel(DataModel dataModel) {
//      if (this.dataModel != null) {
//           throw new IllegalStateException("Model can only be initialized once");
//       }
//       this.dataModel = dataModel;
//  }
//This is what is getting run in the UI Controller

public void click() {
System.out.println("Click");
}

}

Контроллеры, указанные в Main.java, явно инициализируются с помощью DataModel. Я попробовал запустить на нем initModel с помощью FXMLLoader из основного класса, но он вернул NPE, поэтому я не думаю, что это решение. Я думаю, мне нужно а) найти способ передать DataModel при инициализации ClickerController или б) найти способ доступа к DataModel изнутри дочернего класса ClickerController.

Подробнее здесь: https://stackoverflow.com/questions/789 ... hild-class
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»