#javafx #parameter-passing
#javafx #передача параметров
Вопрос:
В моей первой сцене пользователь выбирает команду из таблицы, а в следующей — информация об этой команде. Однако моя проблема заключается в передаче строки (сохраненной в виде метки) в следующую сцену, которая показывает результаты выбранных команд.
public void goResults(ActionEvent event) throws IOException{
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("TeamResults.fxml"));
Parent tableViewParent = (Parent)loader.load();
Scene tableViewScene = new Scene(tableViewParent);
//access controller and call method
TeamResultsController controller = loader.getController();
controller.initData(teamLabel.getText());
Это я передаю название команды (teamLabel) из сцены 2 в сцену 3, когда выбрана кнопка результатов.
private String team;
public void initData(String teamName) {
this.team = teamName;
Это функция, в которую я передаю значение метки и устанавливаю его в string team.
Однако, если я попытаюсь напечатать переменную team вне этой функции, ей будет присвоено значение null. Как мне заставить его хранить значение вне initData?
Например:
public void initialize(URL url, ResourceBundle rb) {
try {
Connection con = DBConnector.connect();
ResultSet rs = con.createStatement().executeQuery("SELECT DISTINCT t1.title AS title, t2.title AS title2, g.score1, g.score2 FROM games g INNER JOIN teams AS t1 ON g.team1_id = t1.id INNER JOIN teams AS t2 ON g.team2_id = t2.id WHERE g.team1_id =" team "OR g.team2_id =" team "");
while(rs.next()){
reslist.add(new TeamResultsTable(rs.getString("title"), rs.getString("title2"), rs.getInt("score1"), rs.getInt("score2")));
}
} catch (SQLException ex) {
Logger.getLogger(TableController.class.getName()).log(Level.SEVERE, null, ex);
}
title.setCellValueFactory(new PropertyValueFactory<TeamResultsTable, String>("title"));
title2.setCellValueFactory(new PropertyValueFactory<TeamResultsTable, String>("title2"));
score1.setCellValueFactory(new PropertyValueFactory<TeamResultsTable, Integer>("score1"));
score2.setCellValueFactory(new PropertyValueFactory<TeamResultsTable, Integer>("score2"));
gameTable.setItems(reslist);
Я пытаюсь передать ее в этот запрос (пока не беспокойтесь о подготовленном операторе).
Какой метод вы бы порекомендовали? Я понимаю, что это предположительно похоже на другие примеры потоков, но мне еще предстоит сопоставить его с моим. Я прошу прощения за свою неопытность, но какой-то фреймворк был бы невероятен.
Однако любая помощь будет отличной, спасибо.
Ответ №1:
вы не можете использовать значение at, initialize
потому что initialize
вызывается в loader.load()
, и в этот раз это действительно null
значение. вы можете выполнить запрос после controller.initData(teamLabel.getText());
вызова get в новой функции (и вызвать эту функцию) или даже внутри initData
другой не рекомендуемый вариант — передавать контроллер в качестве объекта загрузчику (и помещать все необходимые значения перед загрузкой), но если вы сделаете это, у вас возникнут проблемы с определением контроллера в файле fxml