2015-05-31 4 views
2

Я видел много вопросов, похожих на мои, но я не понял, как решить мою проблему, поэтому есть мой код:javaFX - как использовать функцию или объект контроллера с другого контроллера

у меня есть простой основной:

MainClassFXGui.java

public class MainClassFXGui extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("MyProgramMainGuiTab.fxml")); 

     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.setTitle("Assicurazione"); 
     stage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

и три FXML файлов, один из них, который содержит два других, по тэгу

<fx:include source="MyTab1.fxml" /> 

MyProgramMainGuiTab.fxml

... 
<TabPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="5000.0" prefWidth="5000.0" tabClosingPolicy="UNAVAILABLE"> 
      <tabs> 
       <Tab closable="false" text="MyTab1"> 
        <content> 
    <fx:include source="MyTab1.fxml" /> 
        </content> 
       </Tab> 
       <Tab closable="false" text="MyTab2"> 
        <content> 
    <fx:include source="MyTab2.fxml" /> 
        </content> 
       </Tab> 
      </tabs> 
    </TabPane> 
... 

и три контроллера:

MyProgramMainGuiTabController.java

.... 
@FXML 
private Label LeftSt; 
/** 
* Initializes the controller class. 
*/ 
@Override 
public void initialize(URL url, ResourceBundle rb) { 
    LeftSt.setText(""); 
}  

public void setLeftSt(String st){ 
    LeftSt.setText(st); 
} 
... 

MyTab1Controller.java

@FXML 
private void handleButtonAction(ActionEvent event) { 
    System.out.println("You clicked me!"); 
    setLeftSt("Can I change the label of the MyProgramMainGuiTabController?"); 
} 

Я пытался таким образом:

MyTab1Controller.java

private MyProgramMainGuiTabController controller; 

@FXML 
private void handleButtonAction(ActionEvent event) { 
     System.out.println("You clicked me!"); 
     controller.setLeftSt("Can I change the label of the MyProgramMainGuiTabController?"); 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    FXMLLoader fxmlLoader = new 
    FXMLLoader(getClass().getResource("MyProgramMainGuiTab.fxml")); 
    try { 
     fxmlLoader.load();    
    } catch (IOException exception) { 
     throw new RuntimeException(exception); 
    } 
    controller = (MyProgramMainGuiTabController)fxmlLoader.getController(); 
} 

Но у меня есть исключения нулевого указателя или если перенести код instanzialization объектного «контроллера» в функции handleButtonAction, у меня нет какой-либо ошибки, но метка не изменяется.

Может быть, я могу создать статическую сцену и статическую сцену в MainClassFXGui.java? , но тогда я не знаю, как я мог бы использовать их ...

MainClassFXGui.java

public class MainClassFXGui extends Application { 
    static private Scene scene; 
    static private Stage stage; 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("MyProgramMainGuiTab.fxml")); 

     this.scene = new Scene(root); 
     stage.setScene(scene); 
     stage.setTitle("Assicurazione"); 
     stage.show(); 
     this.stage = stage; 
    } 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    public static Scene getScene(){ 
     return AssicurazioneFXGui.scene; 
    } 

    public static Stage getStage(){ 
     return AssicurazioneFXGui.stage; 
    } 

} 

я могу сделать что-то с getScene() или GetStage()? любая идея или предложение?

спасибо всем

+0

Можете ли вы изучить этот вопрос и мой ответ на него, если он уже помогает ?: http://stackoverflow.com/q/21995359/1396265 - Спасибо - Райнер –

+0

Привет, Райнер, да, я уже посмотрел этот вопрос, но мне не помогло: когда я попытался использовать контроллер, у меня было исключение nullpointer, если я вставил код в «inizialize», или ничего не сделал, если я поместил код в функцию. (может быть, я это неправильно понял?) – Matteo

+0

Можете ли вы рассказать о сценарии? это изменение текста ярлыка, нажав на кнопку? – Calips

ответ

0

На данный момент я решил таким образом. Если в любом случае у кого-то есть лучшее решение, напишите. Кроме того, поскольку это не решает проблему, если мне нужно выполнить функцию .. спасибо

MyProgramMainGuiTabController.fxml

... 
@FXML 
private Label LeftSt; 
/** 
* Initializes the controller class. 
*/ 
@Override 
public void initialize(URL url, ResourceBundle rb) { 
    LeftSt.setText(""); 
} 
... 

MyTab1Controller.FXML

@FXML 
private Button myObject; 

private Scene scene; 
private Label lblDataLeft; 

@FXML 
private void handleButtonAction(ActionEvent event) { 
     System.out.println("You clicked me!"); 
     setLeftSt("this works!"); 
} 

public void setLeftSt(String st){ 
    if(this.scene == null) 
     this.scene = myObject.getScene(); 
    if(this.lblDataLeft==null) 
     this.lblDataLeft = (Label) scene.lookup("#LeftSt"); 
    if (this.lblDataLeft!=null) 
     this.lblDataLeft.setText(st); 
} 
1

Определите StringProperty в MyTab1Controller с обычными методами:

public class MyTab1Controller { 

    private final StringProperty leftSt = new SimpleStringProperty(); 

    public StringProperty leftStProperty() { 
     return leftSt ; 
    } 

    public final String getLeftSt() { 
     return leftStProperty().get(); 
    } 

    public final void setLeftSt(String leftSt) { 
     leftStProperty().set(leftSt); 
    } 

    // ... 

    @FXML 
    public void handleButtonAction() { 
     setLeftSt(...); 
    } 

    // ... 
} 

Теперь присвоить атрибут fx:id к fx:include тегу:

<Tab closable="false" text="MyTab1"> 
    <content> 
     <fx:include fx:id="myTab1" source="MyTab1.fxml" /> 
    </content> 
</Tab> 

Это означает, что вы можете впрыснуть контроллер для MyTab1.fxml в контроллер г для FXML, где он включен (MyProgramMainGuiTabController):

public class MyProgramMainGuiTabController { 

    @FXML 
    private MyTab1Controller myTab1Controller ; 

} 

, а затем вы можете просто наблюдать свойства и обновлять метку, когда она меняется:

public class MyProgramMainGuiTabController { 

    @FXML 
    private MyTab1Controller myTab1Controller ; 

    @FXML 
    private Label leftSt; 

    public void initialize() { 
     leftSt.setText(""); 
     myTab1Controller.leftStProperty().addListener((obs, oldValue, newValue) -> 
      leftSt.setText(newValue)); 
    }  
} 

Обратите внимание на правила в том, что поле имя для контроллера - это значение атрибута fx:id с добавленным словом «Контроллер»: myTab1 в fx:id разрешает myTab1Controller для поля, в которое вводится контроллер. См. NestedControllers для получения дополнительной информации.

+0

Nice one! благодаря – Matteo