NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: JavaFX jak dostat textfield z jedný scény, který by se napsal v labelu jiné scény?

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
rachet
Člen
Avatar
rachet:9.1.2017 18:53

Jak už napovídá nadpis, tak mám dvě scény. V jedné mám textfield a v druhé scéně label. Po zadání nějaké hodnoty v textfieldu bych se měl přepnout do druhé scény, kde na mě bude čekat label s Slovo: ,,slovo z první scény". Neví někdo jak na to? Mám jeden Controller a dva fxml scény.

 
Odpovědět
9.1.2017 18:53
Avatar
Patrik
Člen
Avatar
Patrik:9.1.2017 19:01

Ja by som si asi uložil hodnotu tf do premennej (pomocou metody getText()) a na druhej scene dáš label.setText(pre­mennaSUlozenou­Hodnotou);
poznámka:
Nezabudni na modifikátory prístupu. :)
A možno by to šlo aj bez premennej...

Editováno 9.1.2017 19:04
 
Nahoru Odpovědět
9.1.2017 19:01
Avatar
rachet
Člen
Avatar
Odpovídá na Patrik
rachet:9.1.2017 20:13

Přesně tohle jsem udělal a hodilo mi to NullPointerEx­ception :/

 
Nahoru Odpovědět
9.1.2017 20:13
Avatar
Odpovídá na rachet
Petr Štechmüller:9.1.2017 20:31

Ahoj, hoď sem zdrojaky těch FXML a kontroléru.

Nahoru Odpovědět
9.1.2017 20:31
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
rachet
Člen
Avatar
rachet:11.1.2017 15:39

PRVNÍ FXML:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.101" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
    <children>
        <Label layoutX="167.0" layoutY="124.0" text="Jméno:" />
        <Label layoutX="173.0" layoutY="169.0" text="Heslo:" />
        <Button layoutX="239.0" layoutY="215.0" mnemonicParsing="false" onAction="#prihlasit" text="Přihlášení" />
        <Button layoutX="337.0" layoutY="215.0" mnemonicParsing="false" onAction="#registrovat" text="Registrace" />
        <TextField fx:id="tfield_jmeno" layoutX="239.0" layoutY="119.0" />
        <PasswordField fx:id="tfield_heslo" layoutX="239.0" layoutY="164.0" />
      <Button layoutX="14.0" layoutY="355.0" mnemonicParsing="false" onAction="#log_ukoncit" text="Ukončit aplikaci" />
      <Label layoutX="239.0" layoutY="54.0" text="LEETOUT KLIENT V.2.0.1">
         <font>
            <Font name="System Bold" size="15.0" />
         </font>
      </Label>
      <Label layoutX="426.0" layoutY="360.0" text="(C) LEETOUT ELEMENT">
         <font>
            <Font name="System Bold" size="15.0" />
         </font>
      </Label>
    </children>
</AnchorPane>

DRUHEJ FXML

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.101" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
    <children>
        <Label layoutX="167.0" layoutY="124.0" text="Jméno:" />
      <Button layoutX="14.0" layoutY="355.0" mnemonicParsing="false" onAction="#log_ukoncit" text="Ukončit aplikaci" />
      <Label layoutX="239.0" layoutY="54.0" text="LEETOUT KLIENT V.2.0.1">
         <font>
            <Font name="System Bold" size="15.0" />
         </font>
      </Label>
      <Label layoutX="426.0" layoutY="360.0" text="(C) LEETOUT ELEMENT">
         <font>
            <Font name="System Bold" size="15.0" />
         </font>
      </Label>
      <Label fx:id="aplikaceJmeno" layoutX="239.0" layoutY="124.0" />
    </children>
</AnchorPane>

Controller

public TextField tfield_jmeno;

public void prihlasit(ActionEvent actionEvent) {
        conn = MySqlConnect.ConnectDB();
        String sql = "Select * from registrovani where nick = ? and password = ?";
        try {
            pst = conn.prepareStatement(sql);
            pst.setString(1, tfield_jmeno.getText());
            pst.setString(2, tfield_heslo.getText());
            rs = pst.executeQuery();
            if (rs.next()) {
                Stage x = new Stage();
                this.aplikaceWindow(x);
                Stage skryti = (Stage) tfield_jmeno.getScene().getWindow();
                skryti.close();
                String prihlasovaci_jmeno = tfield_jmeno.getText();
                aplikaceJmeno.setText(prihlasovaci_jmeno);
            } else {
                JOptionPane.showMessageDialog(null, "bad");
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
 
Nahoru Odpovědět
11.1.2017 15:39
Avatar
Odpovídá na rachet
Petr Štechmüller:11.1.2017 15:56

Můžeš doplnit celý kód kontroleru?
btw. proč používáš dialogy ze Swingu?

Nahoru Odpovědět
11.1.2017 15:56
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
rachet
Člen
Avatar
Odpovídá na Petr Štechmüller
rachet:11.1.2017 16:22

Ty Swingový jsou dočasný, pak je nahradim fxkovejma,

Tady je ten Controller:

package sample;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.input.InputMethodEvent;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import jdk.nashorn.internal.scripts.JO;

import java.sql.*;
import java.util.InputMismatchException;
import javax.swing.*;

public class Controller {
    public TextField tfield_jmeno;
    public PasswordField tfield_heslo;
    public TextField reg_jmeno;
    public PasswordField reg_heslo;
    public PasswordField reg_heslo2;
    public TextField reg_mail;
    public TextField reg_vek;
    public Label shodnost;
    @FXML
    private Label aplikaceJmeno;

    Connection conn = null;
    PreparedStatement pst = null;
    ResultSet rs = null;

    private void loginWindow(Stage newStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        newStage.setTitle("PŘIHLÁŠENÍ DO SYSTEMU");
        newStage.setScene(new Scene(root, 600, 400));
        newStage.show();
    }

    private void registraceWindow(Stage newStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("registrationWindow.fxml"));
        newStage.setTitle("REGISTRACE DO SYSTEMU");
        newStage.setScene(new Scene(root, 600, 400));
        newStage.show();
    }

    private void aplikaceWindow(Stage newStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("aplication.fxml"));
        newStage.setTitle("LEETOUT KLIENT");
        newStage.setScene(new Scene(root, 600, 400));
        newStage.show();
    }

    public void prihlasit(ActionEvent actionEvent) {
        conn = MySqlConnect.ConnectDB();
        String sql = "Select * from registrovani where nick = ? and password = ?";
        try {
            pst = conn.prepareStatement(sql);
            pst.setString(1, tfield_jmeno.getText());
            pst.setString(2, tfield_heslo.getText());
            rs = pst.executeQuery();
            if (rs.next()) {
                Stage x = new Stage();
                this.aplikaceWindow(x);
                Stage skryti = (Stage) tfield_jmeno.getScene().getWindow();
                skryti.close();
                String prihlasovaci_jmeno = tfield_jmeno.getText();
                aplikaceJmeno.setText(prihlasovaci_jmeno);
            } else {
                JOptionPane.showMessageDialog(null, "bad");
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
    }

    public void registrovat(ActionEvent actionEvent) {
        try {
            Stage x = new Stage();
            this.registraceWindow(x);
            Stage skryti = (Stage) tfield_jmeno.getScene().getWindow();
        } catch (Exception e) {

            JOptionPane.showMessageDialog(null, e);
        }

    }

    public void reg_registrace(ActionEvent actionEvent) {
        String jmeno = reg_jmeno.getText();
        String heslo1 = reg_heslo.getText();
        String heslo2 = reg_heslo2.getText();
        String email = reg_mail.getText();
        String vek = reg_vek.getText();


        //int cvek = Integer.parseInt(vek);

        if (jmeno.equals("") || email.equals("") || vek.equals("") || heslo1.equals("") || heslo2.equals("")) {
            JOptionPane.showMessageDialog(null, "Nezadali jste některé z uvedených polí.", "Neúspěšná registrace", JOptionPane.ERROR_MESSAGE);
        } else if (!email.contains("@")) {
            JOptionPane.showMessageDialog(null, "Neplatný formát emailu.", "Neúspěšná registrace", JOptionPane.ERROR_MESSAGE);
        } else if (heslo1.equals(heslo2)) {
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "", "");
                pstmt = conn.prepareStatement("insert into registrovani values(?,?,?,?)");
                pstmt.setString(1, jmeno);
                pstmt.setString(2, heslo1);
                pstmt.setString(3, vek);
                pstmt.setString(4, email);
                int i = pstmt.executeUpdate();


                if (i > 0) {

                    JOptionPane.showMessageDialog(null, "Úspěšně jste se zaregistrovali, nyní se můžete přihlásit.", "Dokončeno", JOptionPane.INFORMATION_MESSAGE);
                    try {
                        Stage x = new Stage();
                        this.loginWindow(x);
                        Stage skryti = (Stage) reg_heslo2.getScene().getWindow();
                        skryti.close();
                    } catch (Exception eplz2) {
                        JOptionPane.showMessageDialog(null, "Chyba aplikace.");
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "Data nebyla uložena.");
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Neshodná hesla");
        }


    }

    public void reg_exit(ActionEvent actionEvent) {
        System.exit(1);
    }

    public void reg_prihlaseni(ActionEvent actionEvent) {
        try {
            Stage x = new Stage();
            this.loginWindow(x);
            Stage skryti = (Stage) reg_heslo2.getScene().getWindow();
            skryti.close();
        } catch (Exception eplz2) {
            JOptionPane.showMessageDialog(null, "Chyba aplikace.");
        }
    }

    public void log_ukoncit(ActionEvent actionEvent) {
        System.exit(1);
    }


    public void shodnost(KeyEvent keyEvent) {

        String pw1 = reg_heslo.getText();
        String pw2 = reg_heslo2.getText();
        if (pw1.equals(pw2)) {
            shodnost.setText("Hesla jsou shodná.");
            shodnost.setTextFill(Color.web("#33cc33"));


        } else {
            shodnost.setText("Hesla nejsou shodná.");
            shodnost.setTextFill(Color.web("#ff0000"));
        }
    }
}
Editováno 11.1.2017 16:23
 
Nahoru Odpovědět
11.1.2017 16:22
Avatar
Odpovídá na rachet
Petr Štechmüller:11.1.2017 16:32

Nemůžeš mít jeden kontroler pro dva FXML pohledy.
Budu předpokládat, že kód kontroleru co je tady je pro ten první FXML view.
Ty sice definuješ ten Label takto:

@FXML
    private Label aplikaceJmeno;

ale logicky musí být null, protože není v tom prvním FXML view, tedy v tom kontroleru nemá co dělat.

Nahoru Odpovědět
11.1.2017 16:32
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na rachet
Petr Štechmüller:11.1.2017 16:35

V ideálním případě budeš mít pro každé View jeden Kontroler.
Kontroler pak můžeš získat při načítání pomocí FXMLLoaderu třeba takto:

FXMLLoader loader = new FXMLLoader(getClass().getResource("aplication.fxml"));
Parent root = loader.load();
KontrolerProApplicationFXML ctrl = loader.getController();
Editováno 11.1.2017 16:36
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
11.1.2017 16:35
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
rachet
Člen
Avatar
Odpovídá na Petr Štechmüller
rachet:11.1.2017 16:42

Jop, to bude tím, díky moc! :)

 
Nahoru Odpovědět
11.1.2017 16:42
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.