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.
Ja by som si asi uložil hodnotu tf do premennej (pomocou metody getText()) a
na druhej scene dáš label.setText(premennaSUlozenouHodnotou);
poznámka:
Nezabudni na modifikátory prístupu.
A možno by to šlo aj bez premennej...
rachet:9.1.2017 20:13
Přesně tohle jsem udělal a hodilo mi to NullPointerException :/
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);
}
Petr Štechmüller:11.1.2017 15:56
Můžeš doplnit celý kód kontroleru?
btw. proč používáš dialogy ze Swingu?
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"));
}
}
}
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.
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();
+20 Zkušeností
+2,50 Kč
Zobrazeno 10 zpráv z 10.