首页 文章

JavaFX密码字段不起作用

提问于
浏览
0

在场景构建器中,我有一个密码字段,其中包含fx:id passwordBox以及我所拥有的相应控制器类

@FXML private static PasswordField passwordBox = new PasswordField();

我还试过

@FXML private static PasswordField passwordBox;

当我运行程序时,密码字段中的字母是纯文本 . 当我在场景构建器中预览窗口时,会发生同样的事情 . 密码字段是一个PasswordField,所以我没有把它误认为是TextField .

我能做什么?

编辑:FXML文件

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

<?import java.lang.*?>
<?import java.net.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.*?>

<AnchorPane fx:id="mainAnchor" opacity="1.0" prefHeight="200.0" prefWidth="408.0000999999975" styleClass="back" xmlns:fx="http://javafx.com/fxml" fx:controller="application.MainController">
  <!-- TODO Add Nodes -->
  <children>
    <Label fx:id="serverIPLbl" layoutX="14.0" layoutY="28.0" prefWidth="175.0" text="Server IP">
      <font>
        <Font name="Segoe UI" size="12.0" fx:id="x1" />
      </font>
    </Label>
    <TextField fx:id="serverIPBox" layoutX="14.0" layoutY="50.0" prefWidth="175.0" />
    <Label fx:id="portLbl" font="$x1" layoutX="215.0" layoutY="28.0" prefWidth="175.0" text="Port" />
    <TextField fx:id="portBox" layoutX="215.0" layoutY="50.0" prefWidth="175.0" />
    <Label fx:id="passwordLbl" font="$x1" layoutX="14.0" layoutY="81.0" prefWidth="175.0" text="Server Password" />
    <ImageView fx:id="settingsButton" fitHeight="23.0" fitWidth="23.0" layoutX="14.0" layoutY="137.0" onMouseClicked="#settingsClicked" pickOnBounds="true" preserveRatio="true">
      <image>
        <Image url="@../images/gear.png" />
      </image>
    </ImageView>
    <Button id="startServer" fx:id="connectButton" layoutX="14.0" layoutY="167.0" mnemonicParsing="false" onAction="#connectClicked" prefHeight="22.0" prefWidth="376.0" text="Connect" />
    <Label fx:id="usernameLbl" font="$x1" layoutX="215.0" layoutY="81.0" prefWidth="175.0" text="Username" />
    <TextField id="serverIPBox" fx:id="usernameBox" layoutX="215.0" layoutY="103.0" prefWidth="175.0" promptText="a-z A-Z 0-9 _ - chars allowed" />
    <ImageView id="favoriteButton" fx:id="favoritesButton" fitHeight="23.0" fitWidth="23.0" layoutX="55.0" layoutY="137.0" onMouseClicked="#favoritesClicked" pickOnBounds="true" preserveRatio="true">
      <image>
        <Image url="@../images/favorite.png" />
      </image>
    </ImageView>
    <PasswordField fx:id="passwordBox" layoutX="14.0" layoutY="103.0" prefWidth="175.0" promptText="Optional" />
  </children>
  <stylesheets>
    <URL value="@style.css" />
  </stylesheets>
</AnchorPane>

1 回答

  • 1

    Issues with your code

    @FXML 是控制器实例的注入注释,不应将其与 static 成员或使用 new 关键字初始化的成员一起使用 .

    相反,控制器中的定义应该是:

    @FXML private PasswordField passwordBox;
    

    Additional considerations which may or may not apply in your case

    • 控制器实例应始终通过新的FXMLLoader() . load(...)调用创建(不要通过控制器本身的 new 关键字创建,除非您随后使用loader.setController()) .

    • fxml文件必须指定密码字段的名称,该名称与控制器中的名称相匹配(在您的情况下,此名称为 passwordBox ) .

    Example

    GatewayApplication.java

    package application;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.AnchorPane;
    import javafx.stage.Stage;
    
    import java.io.IOException;
    
    public class GatewayApplication extends Application {
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) throws IOException {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("passport.fxml"));
            AnchorPane layout = loader.load();
            stage.setScene(new Scene(layout));
            stage.show();
        }
    }
    

    MainController.java

    SceneBuilder View | Show Sample Skeleton 生成 .

    package application;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.PasswordField;
    import javafx.scene.control.TextField;
    import javafx.scene.image.ImageView;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.AnchorPane;
    
    
    public class MainController {
    
        @FXML
        private ResourceBundle resources;
    
        @FXML
        private URL location;
    
        @FXML
        private Button connectButton;
    
        @FXML
        private ImageView favoritesButton;
    
        @FXML
        private AnchorPane mainAnchor;
    
        @FXML
        private PasswordField passwordBox;
    
        @FXML
        private Label passwordLbl;
    
        @FXML
        private TextField portBox;
    
        @FXML
        private Label portLbl;
    
        @FXML
        private TextField serverIPBox;
    
        @FXML
        private Label serverIPLbl;
    
        @FXML
        private ImageView settingsButton;
    
        @FXML
        private TextField usernameBox;
    
        @FXML
        private Label usernameLbl;
    
    
        @FXML
        void connectClicked(ActionEvent event) {
            System.out.println("password = " + passwordBox.getText());
        }
    
        @FXML
        void favoritesClicked(MouseEvent event) {
        }
    
        @FXML
        void settingsClicked(MouseEvent event) {
        }
    
        @FXML
        void initialize() {
            assert connectButton != null : "fx:id=\"connectButton\" was not injected: check your FXML file 'passport.fxml'.";
            assert favoritesButton != null : "fx:id=\"favoritesButton\" was not injected: check your FXML file 'passport.fxml'.";
            assert mainAnchor != null : "fx:id=\"mainAnchor\" was not injected: check your FXML file 'passport.fxml'.";
            assert passwordBox != null : "fx:id=\"passwordBox\" was not injected: check your FXML file 'passport.fxml'.";
            assert passwordLbl != null : "fx:id=\"passwordLbl\" was not injected: check your FXML file 'passport.fxml'.";
            assert portBox != null : "fx:id=\"portBox\" was not injected: check your FXML file 'passport.fxml'.";
            assert portLbl != null : "fx:id=\"portLbl\" was not injected: check your FXML file 'passport.fxml'.";
            assert serverIPBox != null : "fx:id=\"serverIPBox\" was not injected: check your FXML file 'passport.fxml'.";
            assert serverIPLbl != null : "fx:id=\"serverIPLbl\" was not injected: check your FXML file 'passport.fxml'.";
            assert settingsButton != null : "fx:id=\"settingsButton\" was not injected: check your FXML file 'passport.fxml'.";
            assert usernameBox != null : "fx:id=\"usernameBox\" was not injected: check your FXML file 'passport.fxml'.";
            assert usernameLbl != null : "fx:id=\"usernameLbl\" was not injected: check your FXML file 'passport.fxml'.";
        }
    
    }
    

    style.css文件

    .root {
        -fx-background-color: cornsilk;
    }
    

    passport.fxml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.control.*?>
    <?import javafx.scene.image.Image?>
    <?import javafx.scene.image.ImageView?>
    <?import javafx.scene.layout.AnchorPane?>
    <?import javafx.scene.text.Font?>
    <?import java.net.URL?>
    <AnchorPane fx:id="mainAnchor" opacity="1.0" prefHeight="200.0" prefWidth="408.0000999999975" styleClass="back" xmlns:fx="http://javafx.com/fxml" fx:controller="application.MainController">
        <children>
            <Label fx:id="serverIPLbl" layoutX="14.0" layoutY="28.0" prefWidth="175.0" text="Server IP">
                <font>
                    <Font name="Segoe UI" size="12.0" fx:id="x1" />
                </font>
            </Label>
            <TextField fx:id="serverIPBox" layoutX="14.0" layoutY="50.0" prefWidth="175.0" />
            <Label fx:id="portLbl" font="$x1" layoutX="215.0" layoutY="28.0" prefWidth="175.0" text="Port" />
            <TextField fx:id="portBox" layoutX="215.0" layoutY="50.0" prefWidth="175.0" />
            <Label fx:id="passwordLbl" font="$x1" layoutX="14.0" layoutY="81.0" prefWidth="175.0" text="Server Password" />
            <ImageView fx:id="settingsButton" fitHeight="23.0" fitWidth="23.0" layoutX="14.0" layoutY="137.0" onMouseClicked="#settingsClicked" pickOnBounds="true" preserveRatio="true">
                <image>
                    <Image url="http://icons.iconarchive.com/icons/hopstarter/soft-scraps/24/Gear-icon.png" />
                </image>
            </ImageView>
            <Button id="startServer" fx:id="connectButton" layoutX="14.0" layoutY="167.0" mnemonicParsing="false" onAction="#connectClicked" prefHeight="22.0" prefWidth="376.0" text="Connect" />
            <Label fx:id="usernameLbl" font="$x1" layoutX="215.0" layoutY="81.0" prefWidth="175.0" text="Username" />
            <TextField id="serverIPBox" fx:id="usernameBox" layoutX="215.0" layoutY="103.0" prefWidth="175.0" promptText="a-z A-Z 0-9 _ - chars allowed" />
            <ImageView id="favoriteButton" fx:id="favoritesButton" fitHeight="23.0" fitWidth="23.0" layoutX="55.0" layoutY="137.0" onMouseClicked="#favoritesClicked" pickOnBounds="true" preserveRatio="true">
                <image>
                    <Image url="http://icons.iconarchive.com/icons/hopstarter/soft-scraps/24/Button-Favorite-icon.png"/>
                </image>
            </ImageView>
            <PasswordField fx:id="passwordBox" layoutX="14.0" layoutY="103.0" prefWidth="175.0" promptText="Optional" />
        </children>
        <stylesheets>
            <URL value="@style.css" />
        </stylesheets>
    </AnchorPane>
    

    示例程序UI

    sampleui

    示例程序输出

    在密码字段中输入魔术作品“xyzzy”并按下连接后,程序将从字段中提取密码并将其打印到控制台:

    password = xyzzy
    

    使用的测试系统是运行Java 8b121的OS X 10.9 .

    在将来的这类问题中,您可能需要提供minimal, complete, tested and readable example . 所有问题都不需要这样的样本,但肯定会对此有所帮助 .

相关问题