是否有太多的听众唠叨我的文本域?

时间:2015-10-23 19:27:47

标签: java javafx

所以我创建了一个程序,可以翻译三种数据类型,十进制,十六进制和二进制。我使用dec和hex的监听器完成了这个,但是现在当我为bin创建第三个监听器时,它会在我输入的任何文本字段中随机抽出数字。非常奇怪,我想知道是否有涉及某种倾听冲突,我操纵变量但似乎仍然发生变化。

这是我的整个代码,因为我相信您可能需要将其输入到各自的IDE中。

    package application;


import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class Elias16_5 extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            GridPane paneForVBoxes = new GridPane();
            paneForVBoxes.setPadding(new Insets(10, 10, 10, 10));
            paneForVBoxes.setVgap(10);
            paneForVBoxes.setHgap(10);

            VBox units = new VBox(12);
            units.setAlignment(Pos.CENTER_LEFT);
            Label lbDec = new Label("Decimal");
            Label lbHex = new Label("Hex");
            Label lbBin = new Label("Binary");
            units.getChildren().addAll(lbDec, lbHex, lbBin);


            VBox textFields = new VBox(5);
            TextField tfDec = new TextField();
                tfDec.setPrefColumnCount(19);
                tfDec.setAlignment(Pos.CENTER_RIGHT);
            TextField tfHex = new TextField();
                tfHex.setPrefColumnCount(19);
                tfHex.setAlignment(Pos.CENTER_RIGHT);
            TextField tfBin = new TextField();
                tfBin.setPrefColumnCount(19);
                tfBin.setAlignment(Pos.CENTER_RIGHT);

            textFields.getChildren().addAll(tfDec, tfHex, tfBin);

            paneForVBoxes.add(units, 0, 0);
            paneForVBoxes.add(textFields, 1, 0);

            //Describes conversions for tfDec
            tfDec.textProperty().addListener((observable, oldValue, newValue) -> {
                 if (!newValue.isEmpty()) {
                     tfHex.setText(Long.toHexString(Long.parseLong(newValue)));
                     tfBin.setText(Long.toBinaryString(Long.parseLong(newValue)));
                 } else {
                     tfDec.setText("");
                     tfHex.setText("");
                     tfBin.setText("");
                 }
            });

            //Describes conversions for tfHex
            tfHex.textProperty().addListener((observable, oldValue, newValue) -> {
                 if (!newValue.isEmpty()) {
                     tfDec.setText(Long.toString(Long.parseLong(newValue, 16)));
                     tfBin.setText(Long.toBinaryString(Long.parseLong(newValue, 8)));
                 } else {
                     tfDec.setText("");
                     tfHex.setText("");
                     tfBin.setText("");
                 }
            });

            //Describes conversions for tfBin
////////////This is my trouble area/////////////////////
            tfBin.textProperty().addListener((observable, oldValue, newValue) -> {
                 if (!newValue.isEmpty()) {
                     tfDec.setText(Long.toString(Long.parseLong(newValue)));
                     tfHex.setText(Long.toHexString(Long.parseLong(newValue)));
                 } else {
                     tfDec.setText("");
                     tfHex.setText("");
                     tfBin.setText("");
                 }
            });







            Scene scene = new Scene(paneForVBoxes, 300, 100);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setTitle("Data Conversion");
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

1 个答案:

答案 0 :(得分:0)

我不太了解Long.parseLong(value,radix)的概念;因为我以前从未使用过它。答案是将每个听众设置为翻译到您正在寻找的基础。

例如: 每个监听器的翻译语句的基数也需要具有您正在翻译的数据类型的基础。因此,tfDec监听器内的两个基数应为10,如下所示。

同样应该应用于Hex侦听器的语句,但是使用10的基数,使用16的基数; 2为Binary lisener的陈述。

tfDec.textProperty().addListener((observable, oldValue, newValue) -> {
             if (!newValue.isEmpty()) {
                 tfHex.setText(Long.toHexString(Long.parseLong(newValue, 10)));
                 tfBin.setText(Long.toBinaryString(Long.parseLong(newValue, 10)));
             } else {
                 tfDec.setText("");
                 tfHex.setText("");
                 tfBin.setText("");
             }
        });

希望其他人发现此信息有用!