Jacek Kaczmarski

Jacek Kaczmarski Uczeń szkoły
średniej

Temat: Problem z wywołaniem nowego okna [javaFX]

Witam, napisałem w java(fx) okno ( korzystam z fxml ) posiadające między innymi 2 przyciski, chce żeby po naciśnięciu jednego z nich ( "zarejestruj się"), przyciski i pola służące do logowania niejako zamieniły się z przyciskami i polami służącymi do rejestracji, pomyślałem żeby zamienić pliki fxml odpowiedzialne za wygląd okna i jego zawartość ( kontroler tego pliku też byłby inny).
( staram się to też budować zgodnie z modelem MVC )

widok:

package fxmlexamplemvc;

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class FXMLExampleMVC extends Application{

protected Parent root;
@Override
public void start(Stage stage) throws Exception {
gotoLogin();

Scene scene = new Scene(root);

stage.setScene(scene);
stage.setTitle("JavaFX Welcome!");
scene.getStylesheets().add(FXMLExampleMVC.class.getResource("cssforapp.css").toExternalForm());

stage.show();
}

public void gotoRegister() throws IOException{
root = FXMLLoader.load(getClass().getResource("RegisterFXML.fxml"));
}
public void gotoLogin() throws IOException{
root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
}

public static void main(String[] args) {
launch(args);
}
}


Kontroler:

package fxmlexamplemvc;

import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;


public class SampleController {

public SampleModel model = new SampleModel();
@FXML
protected Text actiontarget;
@FXML
protected PasswordField passwordField;
@FXML
protected TextField loginField;

@FXML protected void handleSubmitButtonAction(){
if((loginField.getText().equals(model.returnLogin()))&&(passwordField.getText().equals(model.returnPass())) ){
actiontarget.setText("You have access !");
} else {
actiontarget.setText("Wrong data !");
}

}
@FXML protected void handleSubmitButtonRegister() throws IOException{
// Tu chce wywołać metodę "gotoRegister", która "zamieni" mi plik(fxml) na ten pożądany.
}
}


Jest jeszcze plik fxml

<?xml version="1.0" encoding="UTF-8"?>


<?import javafx.geometry.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.text.*?>

<GridPane prefHeight="320" prefWidth="360" fx:controller="fxmlexamplemvc.SampleController"
stylesheets="fxmlexamplemvc/cssforapp.css"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
<padding><Insets top="25" right="25" bottom="10" left="25"/></padding>
<Text text="MyWindow" fx:id="welcome"
GridPane.columnIndex="0" GridPane.rowIndex="0"
GridPane.columnSpan="2"/>

<Label text="User Name:"
GridPane.columnIndex="0" GridPane.rowIndex="1"/>
<TextField fx:id="loginField"
GridPane.columnIndex="1" GridPane.rowIndex="1"/>

<Label text="Password:"
GridPane.columnIndex="0" GridPane.rowIndex="2"/>
<PasswordField fx:id="passwordField"
GridPane.columnIndex="1" GridPane.rowIndex="2"/>

<HBox spacing="10" alignment="bottom_right"
GridPane.columnIndex="1" GridPane.rowIndex="4">
<Button text="Register now!"
onAction="#handleSubmitButtonRegister"/>
<Button text="Sign In"
onAction="#handleSubmitButtonAction"/>

</HBox>
<Text fx:id="actiontarget"
GridPane.columnIndex="1" GridPane.rowIndex="6"/>
</GridPane>


I teraz sedno problemu i pytanie, mianowicie: W jaki sposób mogę wywołać tą metodę (gotoRegister która znajduje się w widoku) w Kontrolerze ? Da się to jakoś rozwiązać czy napisać to od nowa ( chociaż też nie mam specjalnie pomysłu jak to zrobić :D ) ?

z góry dziękiJacek Kaczmarski edytował(a) ten post dnia 27.12.12 o godzinie 04:15
Jacek Kaczmarski

Jacek Kaczmarski Uczeń szkoły
średniej

Temat: Problem z wywołaniem nowego okna [javaFX]

Witam ( znów ), znalazłem rozwiązanie ( dokładnie to przykładową aplikacje ), ale mam problem ze zrozumieniem kawałka kodu, gdyby ktoś mógł to "przetłumaczyć" byłoby świetnie:
widok:

public class Main extends Application {

private Stage stage;
private User loggedUser;
private final double MINIMUM_WINDOW_WIDTH = 390.0;
private final double MINIMUM_WINDOW_HEIGHT = 500.0;

public static void main(String[] args) {
Application.launch(Main.class, (java.lang.String[])null);
}

@Override
public void start(Stage primaryStage) {
try {
stage = primaryStage;
stage.setTitle("FXML Login Sample");
stage.setMinWidth(MINIMUM_WINDOW_WIDTH);
stage.setMinHeight(MINIMUM_WINDOW_HEIGHT);
gotoLogin();
primaryStage.show();
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}

public User getLoggedUser() {
return loggedUser;
}

public boolean userLogging(String userId, String password){
if (Authenticator.validate(userId, password)) {
loggedUser = User.of(userId);
gotoProfile();
return true;
} else {
return false;
}
}

/...

private void gotoProfile() {
try {

ProfileController profile = (ProfileController) replaceSceneContent("Profile.fxml");
profile.setApp(this);
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}

private void gotoLogin() {
try {
//CO TO JEST ?
LoginController login = (LoginController) replaceSceneContent("Login.fxml");
login.setApp(this);
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}

private Initializable replaceSceneContent(String fxml) throws Exception {
FXMLLoader loader = new FXMLLoader();
InputStream in = Main.class.getResourceAsStream(fxml);
loader.setBuilderFactory(new JavaFXBuilderFactory());
loader.setLocation(Main.class.getResource(fxml));
AnchorPane page;
try {
page = (AnchorPane) loader.load(in);
} finally {
in.close();
}
Scene scene = new Scene(page, 800, 600);
stage.setScene(scene);
stage.sizeToScene();
return (Initializable) loader.getController();
}
}



kontroller

public class LoginController extends AnchorPane implements Initializable {

@FXML
TextField userId;
@FXML
PasswordField password;
@FXML
Button login;
@FXML
Label errorMessage;

private Main application;


public void setApp(Main application){
this.application = application;
}

@Override
public void initialize(URL location, ResourceBundle resources) {
errorMessage.setText("");
userId.setPromptText("demo");
password.setPromptText("demo");

}


public void processLogin(ActionEvent event) {
if (application == null){
// We are running in isolated FXML, possibly in Scene Builder.
// NO-OP.
errorMessage.setText("Hello " + userId.getText());
} else {
if (!application.userLogging(userId.getText(), password.getText())){
errorMessage.setText("Username/Password is incorrect");
}
}
}
}



Chodzi mi tu o metody gotoProfile i gotoLogin ( widok ), i ten fragment

LoginController login = (LoginController) replaceSceneContent("Login.fxml");
login.setApp(this);

Tu zostało wykonane jakieś rzutowanie ? Czy ktoś rozumie jakie intencję miał autor tego kodu pisząc takie coś ?

Następna dyskusja:

Action nowego okna problem




Wyślij zaproszenie do