JavaFX, ошибка с моей аннотацией и моим событием on - PullRequest
0 голосов
/ 01 августа 2020

В файле контроллера, где написано public void handle(ActionEvent event), event выделено красным цветом, и, поскольку я новичок в JavaFX, я до сих пор не знаю, что вызывает эту проблему, какие-либо идеи о том, что я могу сделать и что я могу сделать, чтобы улучшить свой код?

Я не очень хорошо разбираюсь в словах высокого уровня и их значении, поэтому, если есть более простой способ объяснить, что это означает в вашем объяснении, было бы здорово .

Main. java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.Window;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("Loginone.fxml"));
        primaryStage.setTitle("Login1st");
        primaryStage.setScene(new Scene(root, 900, 600));
        primaryStage.show();

    }

    public void showAlert(Alert.AlertType alertType, Window owner, String title, String message) {
      Alert alert = new Alert(alertType);
      alert.setTitle(title);
      alert.setHeaderText(null);
      alert.setContentText(message);
      alert.initOwner(owner);
      alert.show();
    }

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

Контроллер. java

package sample;

import javafx.event.ActionEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import javafx.stage.Window;
import sample.Main;

public class Controller {

  @FXML
  private Pane wholeLightPurple;

  @FXML
  private Pane purpleBox;

  @FXML
  private Text LoginTitle;

  @FXML
  private TextField userIDbox;

  @FXML
  private Text userIDText;

  @FXML
  private Text passwordText;

  @FXML
  public Button submitButton;

  @FXML
  private PasswordField passwordField;

  @Override
  submitButton.setOnAction(new EventHandler<ActionEvent>()) {
     public void handle(ActionEvent event) {
       if (passwordField.getText().isEmpty()) {
         showAlert(Alert.AlertType.ERROR, purpleBox.getScene().getWindow(), "Form Error!", "Please Fill out the Form");
       }
    }

  }


  public void showAlert(Alert.AlertType alertType, Window owner, String title, String message) {
    Alert alert = new Alert(alertType);
    alert.setTitle(title);
    alert.setHeaderText(null);
    alert.setContentText(message);
    alert.initOwner(owner);
    alert.show();
  }






}

Loginone.f xml

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>

<Pane fx:id="wholeLightPurple" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="548.0" prefWidth="828.0" scaleShape="false" style="-fx-background-color: #945cb4;" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Pane fx:id="purpleBox" layoutX="484.0" prefHeight="548.0" prefWidth="345.0" scaleShape="false" style="-fx-background-color: #3c1361;">
         <effect>
            <DropShadow />
         </effect>
         <children>
            <Text id="LoginTitle" fx:id="LoginTitle" fill="#d0b4dc" fontSmoothingType="LCD" layoutX="112.0" layoutY="106.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Login" textAlignment="CENTER">
               <font>
                  <Font name="Times New Roman Bold" size="48.0" />
               </font>
            </Text>
            <TextField fx:id="userIDbox" layoutX="66.0" layoutY="249.0" prefHeight="25.0" prefWidth="213.0" style="-fx-background-color: #FFFFFF;" />
            <Text fx:id="userIDText" fill="WHITE" layoutX="66.0" layoutY="238.0" strokeType="OUTSIDE" strokeWidth="0.0" text="User ID :">
               <font>
                  <Font name="Times New Roman Bold" size="14.0" />
               </font>
            </Text>
            <Text fx:id="passwordText" fill="WHITE" layoutX="66.0" layoutY="322.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Password :">
               <font>
                  <Font name="Times New Roman Bold" size="14.0" />
               </font>
            </Text>
            <Button fx:id="submitButton" alignment="CENTER" layoutX="123.0" layoutY="387.0" mnemonicParsing="false" prefHeight="16.0" prefWidth="98.0" style="-fx-background-color: #ffffff;" text="Submit" textAlignment="CENTER" wrapText="true">
               <font>
                  <Font name="System Bold" size="12.0" />
               </font></Button>
            <PasswordField fx:id="passwordField" layoutX="66.0" layoutY="326.0" prefHeight="25.0" prefWidth="213.0" />
         </children>
      </Pane>
   </children>
</Pane>

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

Пожалуйста, не забудьте использовать интерфейс Initializable при использовании контроллера F XML ... Я изменил класс вашего контроллера вот так. Я решил твой вопрос. Думаю, этот класс может помочь вам найти решение проблемы пользователя.

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import javafx.stage.Window;

public class Controller implements Initializable {

    @FXML
    private Pane wholeLightPurple;

    @FXML
    private Pane purpleBox;

    @FXML
    private Text LoginTitle;

    @FXML
    private TextField userIDbox;

    @FXML
    private Text userIDText;

    @FXML
    private Text passwordText;

    @FXML
    public Button submitButton;

    @FXML
    private PasswordField passwordField;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        submitButton.setOnAction((event) -> {
        if (passwordField.getText().isEmpty()) {
            showAlert(Alert.AlertType.ERROR, purpleBox.getScene().getWindow(), "Form Error!", "Please Fill out the Form");
        }
       }
    );
    }

  public void showAlert(Alert.AlertType alertType, Window owner, String title, String message) {
    Alert alert = new Alert(alertType);
    alert.setTitle(title);
    alert.setHeaderText(null);
    alert.setContentText(message);
    alert.initOwner(owner);
    alert.show();
  }
}
0 голосов
/ 01 августа 2020

Код, который вы разместили в своем вопросе, не компилируется. Я починил это. Он появляется ниже. Сравните его со своим кодом.

Я изменил файл Controller.java. Код, добавляющий обработчик событий к submitButton, был неправильным. Этого не было внутри метода, поэтому я добавил метод initialize(), который автоматически вызывается при загрузке файла F XML.

Я также изменил файл Loginone.fxml. Отсутствует имя класса контроллера. Я не менял Main.

Контроллер. java

package sample;

import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import javafx.stage.Window;

public class Controller {

    @FXML
    private Pane wholeLightPurple;

    @FXML
    private Pane purpleBox;

    @FXML
    private Text loginTitle;

    @FXML
    private TextField userIDbox;

    @FXML
    private Text userIDText;

    @FXML
    private Text passwordText;

    @FXML
    public Button submitButton;

    @FXML
    private PasswordField passwordField;

    public void initialize() {
        submitButton.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                if (passwordField.getText().isEmpty()) {
                    showAlert(Alert.AlertType.ERROR, purpleBox.getScene().getWindow(), "Form Error!", "Please Fill out the Form");
                }
            }
        });
    }

    public void showAlert(Alert.AlertType alertType, Window owner, String title, String message) {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.initOwner(owner);
        alert.show();
    }
}

Loginone.f xml

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>

<Pane fx:id="wholeLightPurple" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="548.0" prefWidth="828.0" scaleShape="false" style="-fx-background-color: #945cb4;" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Pane fx:id="purpleBox" layoutX="484.0" prefHeight="548.0" prefWidth="345.0" scaleShape="false" style="-fx-background-color: #3c1361;">
         <effect>
            <DropShadow />
         </effect>
         <children>
            <Text id="loginTitle" fx:id="LoginTitle" fill="#d0b4dc" fontSmoothingType="LCD" layoutX="112.0" layoutY="106.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Login" textAlignment="CENTER">
               <font>
                  <Font name="Times New Roman Bold" size="48.0" />
               </font>
            </Text>
            <TextField fx:id="userIDbox" layoutX="66.0" layoutY="249.0" prefHeight="25.0" prefWidth="213.0" style="-fx-background-color: #FFFFFF;" />
            <Text fx:id="userIDText" fill="WHITE" layoutX="66.0" layoutY="238.0" strokeType="OUTSIDE" strokeWidth="0.0" text="User ID :">
               <font>
                  <Font name="Times New Roman Bold" size="14.0" />
               </font>
            </Text>
            <Text fx:id="passwordText" fill="WHITE" layoutX="66.0" layoutY="322.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Password :">
               <font>
                  <Font name="Times New Roman Bold" size="14.0" />
               </font>
            </Text>
            <Button fx:id="submitButton" alignment="CENTER" layoutX="123.0" layoutY="387.0" mnemonicParsing="false" prefHeight="16.0" prefWidth="98.0" style="-fx-background-color: #ffffff;" text="Submit" textAlignment="CENTER" wrapText="true">
               <font>
                  <Font name="System Bold" size="12.0" />
               </font></Button>
            <PasswordField fx:id="passwordField" layoutX="66.0" layoutY="326.0" prefHeight="25.0" prefWidth="213.0" />
         </children>
      </Pane>
   </children>
</Pane>

Вот скриншот запущенного приложения.

введите описание изображения здесь

...