Автор Тема: JavaFX Вземане на бутон от един контролер клас в друг.  (Прочетена 1506 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

Meniak

  • Full Member
  • ***
  • Благодарности
  • -Казани: 5
  • -Получени: 4
  • Публикации: 224
Здравейте. Как мога да ползвам метод,бутон,текстово поле и каквото и да било от един ScreenControler в друг ScreenControler.

Пример : Главния ми screen представлява една таблица "TableView" в която са записани имена телефони адреси и т.н.т. на хора.
Към главния screen си има и един controler class в който има един метод който зарежда данните от базата данни в таблицата.
В screen-а има бутони - създаване на нов запис, редактиране на запис, изтриване на запис който след като бъдат натиснати се отваря нов screen към който съответно си има друг controler class, и при редактиране изтриване или нов запис той променя нещо в Базата данни обаче  искам след промяната да пре зареда данните от таблицата в главния screen за да мога да видя промените веднага.

От доста размисли и страсти стигнах до заключение че трябва да използвам метода от главния screen "дето зарежда данните в таблицата" в под screen-а за да пре зареда данните с таблицата след промяната по базата данни но нещо не ми се получава трика с използването на метода а и не знам дали въобще това е възможно и ако е възможно дали е добро решение.

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: JavaFX Вземане на бутон от един контролер клас в друг.
« Отговор #1 -: 25 Октомври 2014, 12:00:09 »
Сега ще ти опиша един начин, за който обаче не съм сигурен, че е най-добър.
Идеята като цяло е да държиш рефенция към елемента на първия ScreenController, който искаш да ти е достъпен, във втория ScreenController.

Main.java
Код: Java
  1. package application;
  2.        
  3. import javafx.application.Application;
  4. import javafx.fxml.FXMLLoader;
  5. import javafx.stage.Stage;
  6. import javafx.scene.Scene;
  7. import javafx.scene.layout.Pane;
  8.  
  9.  
  10. public class Main extends Application {
  11.         @Override
  12.         public void start(Stage primaryStage) {
  13.                 try {
  14.                         FXMLLoader loader = new FXMLLoader();
  15.                         loader.setLocation(Main.class.getResource("RootLayout.fxml"));
  16.                         Pane rootLayout = (Pane) loader.load();
  17.                         Scene scene = new Scene(rootLayout);
  18.                         primaryStage.setScene(scene);
  19.                         primaryStage.show();
  20.                 } catch(Exception e) {
  21.                         e.printStackTrace();
  22.                 }
  23.         }
  24.        
  25.         public static void main(String[] args) {
  26.                 launch(args);
  27.         }
  28. }

RootLayout.fxml
Код: XML
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <?import javafx.scene.control.*?>
  4. <?import java.lang.*?>
  5. <?import javafx.scene.layout.*?>
  6.  
  7.  
  8. <Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="182.0" prefWidth="269.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.RootController">
  9.    <children>
  10.       <Button fx:id="btnRoot" layoutX="88.0" layoutY="116.0" mnemonicParsing="false" onAction="#rootButtonClicked" text="Open SubView" />
  11.       <Label fx:id="rootLabel" layoutX="63.0" layoutY="63.0" prefHeight="37.0" prefWidth="143.0" />
  12.    </children>
  13. </Pane>

ChildLayout.fxml
Код: XML
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <?import javafx.scene.control.*?>
  4. <?import java.lang.*?>
  5. <?import javafx.scene.layout.*?>
  6.  
  7.  
  8. <Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="62.0" prefWidth="269.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ChildController">
  9.    <children>
  10.       <Button fx:id="btnChild" layoutX="88.0" layoutY="20.0" mnemonicParsing="false" onAction="#childButtonClicked" text="Open SubView" />
  11.    </children>
  12. </Pane>

И накрая контролерите където всъщност става предаването на референцията.

RootController.java
Код: Java
  1. package application;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javafx.fxml.FXML;
  6. import javafx.fxml.FXMLLoader;
  7. import javafx.scene.Scene;
  8. import javafx.scene.control.Button;
  9. import javafx.scene.control.Label;
  10. import javafx.scene.layout.Pane;
  11. import javafx.stage.Stage;
  12.  
  13. public class RootController {
  14.         @FXML
  15.         private Button btnRoot;
  16.        
  17.         @FXML
  18.         private Label rootLabel;
  19.        
  20.         @FXML
  21.         private void rootButtonClicked() {
  22.                 rootLabel.setText("");
  23.                 try {
  24.                         Stage childStage = new Stage();
  25.                         FXMLLoader loader = new FXMLLoader();
  26.                         loader.setLocation(getClass().getResource("ChildLayout.fxml"));
  27.                         Pane childLayout = (Pane) loader.load();
  28.                         Scene scene = new Scene(childLayout);
  29.                         childStage.setScene(scene);
  30.                        
  31.                         // тука вземаш контролера на детето
  32.                         ChildController cc = ((ChildController) loader.getController());
  33.                         // сега му даваш референция към лейбъла на бащата
  34.                         cc.setRootLabel(rootLabel);
  35.                        
  36.                         childStage.show();
  37.                 } catch (IOException e) {
  38.                         e.printStackTrace();
  39.                 }
  40.         }
  41. }

ChildController.java
Код: Java
  1. package application;
  2.  
  3. import javafx.fxml.FXML;
  4. import javafx.scene.control.Button;
  5. import javafx.scene.control.Label;
  6.  
  7. public class ChildController {
  8.         // тука държиш референция към лейбъла на бащата
  9.         private Label rootLabel;
  10.         private int nrOfClicks = 0;
  11.        
  12.  
  13.         @FXML
  14.         private Button btnChild;
  15.  
  16.         @FXML
  17.         private void childButtonClicked() {
  18.                 nrOfClicks++;
  19.                 rootLabel.setText("Child Button Clicked: " + nrOfClicks);
  20.         }
  21.  
  22.         public void setRootLabel(Label rootLbl) {
  23.                 this.rootLabel = rootLbl;
  24.         }
  25. }

Meniak

  • Full Member
  • ***
  • Благодарности
  • -Казани: 5
  • -Получени: 4
  • Публикации: 224
Re: JavaFX Вземане на бутон от един контролер клас в друг.
« Отговор #2 -: 25 Октомври 2014, 13:37:20 »
Отново благодаря.

Що се отнася за това кое е правилно и кое не. Питах има няма 20 Java програмиста какво е правилен код и получих има няма 40 различни отговора като един от отговорите беше най-смислен за мен.

Отговора беше "Правилен код е този дето работи и използва възможно най-малко ресурс" като имаше и условие да е четим и дъра бъра ама за мен това остана най смисления отговор и за това се старая да пиша работещ код дето иска максимално малък ресурс за целта за която е писан, а дали е правилно написан според някои ????? Всеки си има вкус казало кучето и се облизало под опашката.