2014-09-12 2 views
0

Что я хочу сделать, это изменить размер сцены (окна приложения), чтобы изменить размер содержимого внутри окна. Я разместил свой код, который я сделал до сих порДоступ к методу контроллера fxml из загрузчика fxml

Загрузчик класса

public class ResizingButtons extends Application { 

@Override 

public void start(Stage stage) throws Exception { 

    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
    Scene scene = new Scene(root); 
    stage.setScene(scene); 
    stage.show(); 
    scene.widthProperty().addListener(new ChangeListener<Number>() { 

     @Override 
     public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { 
      try{ 
      System.out.println("Scene Width Property is " + scene.getWidth()); 
      } 
      catch(Exception e){ 
       System.out.println("Error in width listener of scene" +e.getMessage()); 
      } 
     } 
    }); 
} 

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

И это контроллер FXMLDocument.fxml FXML класса

public class FXMLDocumentController implements Initializable { 

@FXML 
public Button btn1; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
}  

public void changeBtnSize(){ 
    btn1.setPrefHeight(200); 
    btn1.setStyle("-fx-background-color:red"); 
    } 
} 

Когда размер окна , я хочу получить доступ к методу changeBtnSize() класса контроллера.

ответ

1

Вы можете получить экземпляр контроллера от FXMLLoader. Рефакторинг кода следующим образом:

@Override 
public void start(Stage stage) throws Exception { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml")); // Use loader instance 
    Parent root = loader.load(); 
    FXMLDocumentController controller = loader.getController(); // Now you have controller refference here 
    //add your listener, feel free to use your controller inside listener implementation 
} 
+0

Теперь я перед проблемой всякий раз, когда я пытаюсь сделать изменения в компонентах FXML, из ChangeListener() метод класса загрузчика, он дает нулевой 'code' scene.widthProperty () .addListener (новый ChangeListener () { @Override общественного недействительными изменилась (ObservableValue наблюдаемым, номер OldValue, номер новое_значение) { попробовать { controller.resizeComponents();} улов (Исключение e) { System.out.println (e.getMessage()); } } }); 'code' – viper

+0

@viper Пожалуйста, предоставьте подробную информацию о полученной ошибке – SimY4

+0

, когда я попытался вызвать метод контроллера, из прослушивателя изменений класса loader, он выполняет инструкции печати, но дает значение null, если я попытался внести какие-либо изменения в компоненты FXML scene.widthProperty(). добавления слушатель (новый ChangeListener () { @Override общественный недействительными изменились (ObservableValue наблюдаемый номер OldValue, номер новое_значение) { Try { controller.resizeComponents (); // контроллер - это объект fxmlcontroller } // код в контроллере public void resizeComponents() { System.out.println ("hi"); acPane.setMinSize (300, 400); } – viper

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