【问题标题】:JavaFX Password field not workingJavaFX 密码字段不起作用
【发布时间】:2014-02-07 09:07:08
【问题描述】:

在场景构建器中,我有一个带有 fx:id 密码框的密码字段,在相应的控制器类中我有

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

我也试过了

@FXML 私有静态 PasswordField 密码框;

当我运行程序时,密码字段中的字母是纯文本。当我在场景生成器中预览窗口时,也会发生同样的事情。密码字段是 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>

【问题讨论】:

  • 你能发布你的 fxml 文件吗?

标签: passwords javafx plaintext


【解决方案1】:

您的代码存在问题

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

您的控制器中的定义应该是:

@FXML private PasswordField passwordBox;

可能适用也可能不适用于您的情况的其他注意事项

  • 应始终通过新的 FXMLLoader().load(...) 调用创建控制器实例(而不是通过控制器本身的 new 关键字,除非您随后使用 loader.setController())。
  • fxml 文件必须为您的密码字段指定一个 名称,该名称与您的控制器中的名称相匹配(在您的情况下,此名称为 passwordBox)。

示例

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

SceneBuilderView | 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

示例程序输出

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

password = xyzzy

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

在以后的此类问题中,您可能需要提供minimal, complete, tested and readable example。并非所有问题都需要这样的样本,但肯定会对这个问题有所帮助。

【讨论】:

  • 我按照你的建议做了,但没有任何改变
  • 添加的示例代码不会复制您的问题中提到的问题。
  • 我在控制器类中有一个方法可以调整组件的大小以使用高 dpi 屏幕。所以我的组件必须是静态的,因为方法是静态的。在具有 FXMLLoader 的 Main 类中,我运行该方法。我该如何从所有东西中去除静电并仍然允许它工作?知道为什么密码字段在静态时不起作用吗?
  • 好的,如果我删除我的样式表,那么 PasswordField 将起作用。当我把它加回来时,它又坏了!
猜你喜欢
  • 2015-10-04
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多