Do nového roku jako lepší programátoři? Znovu otevíráme večerní školu programování. Nette framework, návrhové vzory, testování nebo vůbec poprvé kurzy ASP.NET dostupné odkudkoli v republice.

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

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

Avatar
rachet
Člen
Avatar
rachet:

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. ledna 18:53
Avatar
Patrik
Člen
Avatar
Patrik:

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. ledna 19:04
Nahoru Odpovědět 9. ledna 19:01
Nikdy nedovolím aby mi škola bránila v ceste za vzdelaním (Mark Twain).
Avatar
rachet
Člen
Avatar
Odpovídá na Patrik
rachet:

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

 
Nahoru Odpovědět 9. ledna 20:13
Avatar
Odpovídá na rachet
Petr Štechmüller:

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

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

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. ledna 15:39
Avatar
Odpovídá na rachet
Petr Štechmüller:

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

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

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. ledna 16:23
 
Nahoru Odpovědět 11. ledna 16:22
Avatar
Odpovídá na rachet
Petr Štechmüller:

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. ledna 16:32
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na rachet
Petr Štechmüller:

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. ledna 16:36
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 11. ledna 16:35
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
rachet
Člen
Avatar
Odpovídá na Petr Štechmüller
rachet:

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

 
Nahoru Odpovědět 11. ledna 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.