font - javafx label background color
Java FX cambia el texto de la etiqueta en una escena de la escena anterior (1)
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("Main.fxml"));
MainController mainController = myLoader.getController();
mainController.setConnectedTokenLabel(context.getConnectedName());
Sin llamar al método de load
de FXMLLoader
, no se crea ninguna instancia de controlador, incluso si el atributo fx:controller
se especifica en el archivo fxml.
Sin embargo, la load
llamadas antes de getController
no ayudará, ya que el fxml simplemente se carga de nuevo con una instancia de controlador diferente.
MainController
"decirle" al ConnectController
sobre el MainController
que se creó. (ver Pasando Parámetros JavaFX FXML )
Una forma sería agregar este código a la clase ConnectController
private MainController mainController;
public void setMainController(MainController mainController) {
this.mainController = mainController;
}
y use este campo en lugar de la variable local en el método connectToken_onMouseClicked()
.
Para llamar al colocador, acceda al controlador después de cargar la vista en connectTokenButton_onMouseClicked()
:
FXMLLoader loader = new FXMLLoader(getClass().getResource("ConnectView.fxml"));
AnchorPane page = loader.load();
loader.<ConnectController>getController().setMainController(this);
Tengo una clase Main
inicia mi aplicación que tiene su clase MainController
especificada en fxml. Al hacer clic en el botón Connect
se abren otras ventanas con diferente escena y controlador. Basado en la acción, me gustaría cambiar el valor del texto de la Label
través de mi MainController
, pero no funciona como se esperaba. Vea los detalles abajo.
Básicamente, me gustaría actualizar el texto en connectedLabel
en la clase MainController
clase ConnectController
y no funciona.
Main.java
:
public class Main extends Application {
private static final Logger logger = Logger.getLogger(Main.class.getName());
@Override
public void start(Stage primaryStage) {
try {
logger.info("Application is starting");
AnchorPane page = FXMLLoader.load(getClass().getResource("Main.fxml"));
//BorderPane root = new BorderPane();
//Scene scene = new Scene(root,400,400);
Scene scene = new Scene(page);
scene.getStylesheets().add(getClass().getResource("Main.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.setResizable(false);
primaryStage.show();
} catch(Exception e) {
logger.warning(e.getMessage());
}
}
public static void main(String[] args) {
launch(args);
}
}
MainController.java
:
public class MainController implements Initializable {
private Context context = null;
@FXML
Label connectedLabel;
@FXML
Button connectButton;
@Override
public void initialize(URL location, ResourceBundle resources) {
context = Context.getInstance();
}
public void setConnectedLabel(String name) {
connectedLabel.setText(name);
connectButton.setText("Disconnect");
}
@FXML
public void connectTokenButton_onMouseClicked() {
try {
if (connectTokenButton.getText().equals("Disconnect")) {
boolean disconnected = context.getToken().disconnectToken();
if (disconnected) {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Disconnected");
alert.setHeaderText(null);
alert.setContentText("Succcessfully disconnected!");
alert.showAndWait();
connectedTokenLabel.setText("N/A");
connectTokenButton.setText("Connect");
}
} else {
AnchorPane page = FXMLLoader.load(getClass().getResource("ConnectView.fxml"));
Stage stage = new Stage();
Scene scene = new Scene(page);
scene.getStylesheets().add(getClass().getResource("ConnectView.css").toExternalForm());
stage.setScene(scene);
stage.setResizable(false);
stage.initModality(Modality.APPLICATION_MODAL);
stage.initOwner(connectedLabel.getScene().getWindow());
stage.show();
//Stage thisStage = (Stage) connectedTokenLabel.getScene().getWindow();
//thisStage.close();
}
} catch (Exception e) {
System.out.println(e);
}
}
}
ConnectController.java
:
public class ConnectController implements Initializable {
private Context context = null;
@FXML
ComboBox<String> selectComboBox;
@FXML
PasswordField userPinPasswordField;
@FXML
Button cancelButton;
@Override
public void initialize(URL location, ResourceBundle resources) {
context = Context.getInstance();
}
public void setMainC(Stage stage) {
mainStage = stage;
}
@FXML
private void connectToken_onMouseClicked() {
String pin = userPinPasswordField.getText();
boolean connected = context.connect(selectComboBox.getValue(), pin);
if (connected) {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Connected");
alert.setHeaderText(null);
alert.setContentText("Succcessfully connected!");
alert.showAndWait();
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("Main.fxml"));
MainController mainController = myLoader.getController();
mainController.setConnectedTokenLabel(context.getConnectedName());
Stage thisStage = (Stage) selectComboBox.getScene().getWindow();
thisStage.close();
}
}
}
¿Qué estoy haciendo mal al llamar setConnectedLabel
método setConnectedLabel
desde un controlador diferente?