2017-05-22 47 views
0

我正在写一个基本的GUI应用程序,涉及一个TextFields窗格,代表5种方法将一个字节输入到程序的缓冲区中。这个想法是,当你编辑其中一个文本字段时,其他4将用你正在编辑的翻译值进行更新。例如,将十六进制字段更改为“FF”将使小数字段立即更改为“255”,依此类推。javafx文本字段,相互更新

问题是,我不知道如何避免一个更改时无限循环的更新:十六进制字段已更改,它修改小数字段,然后尝试再次更新十六进制字段,等等,创建堆栈溢出错误。

这里是代码定义字段和他们的听众:

TextField Inputchar = new TextField(); 
    Inputchar.setPromptText("Enter " + Program.BYTES_OF_BUFFER + " character(s)..."); 
    Inputchar.setMinWidth(250); 

    TextField Inputhex = new TextField(); 
    Inputhex.setPromptText("Enter a value between 0 and " + Program.BUFFER_SIZE.toString(16) + "..."); 

    TextField Inputdec = new TextField(); 
    Inputdec.setPromptText("Enter a value between 0 and " + Program.BUFFER_SIZE.toString(10) + "..."); 

    TextField Inputoct = new TextField(); 
    Inputoct.setPromptText("Enter a value between 0 and " + Program.BUFFER_SIZE.toString(8) + "..."); 

    TextField Inputbin = new TextField(); 
    Inputbin.setPromptText("Enter a value between 0 and " + Program.BUFFER_SIZE.toString(2) + "..."); 

    Inputchar.textProperty().addListener(c -> { 
     char[] cs = Inputchar.getText().toCharArray(); 
     byte[] b = new byte[cs.length]; 
     for (int i = 0; i < cs.length; i++) { 
      b[i] = (byte) cs[i]; 
     } 
     BigInteger B = new BigInteger(b); 
     Inputhex.setText(B.toString(16)); 
     Inputdec.setText(B.toString(10)); 
     Inputoct.setText(B.toString(8)); 
     Inputbin.setText(B.toString(2)); 
    }); 

    Inputhex.textProperty().addListener(c -> { 
     BigInteger B = BigInteger.valueOf(Integer.parseInt(Inputhex.getText(), 16)); 
     Inputchar.setText(BF_Program.bytestochars(B.toByteArray())); 
     Inputdec.setText(B.toString(10)); 
     Inputoct.setText(B.toString(8)); 
     Inputbin.setText(B.toString(2)); 
    }); 

    Inputdec.textProperty().addListener(c -> { 
     BigInteger B = BigInteger.valueOf(Integer.parseInt(Inputdec.getText(), 10)); 
     Inputchar.setText(BF_Program.bytestochars(B.toByteArray())); 
     Inputhex.setText(B.toString(16)); 
     Inputoct.setText(B.toString(8)); 
     Inputbin.setText(B.toString(2)); 
    }); 

    Inputoct.textProperty().addListener(c -> { 
     BigInteger B = BigInteger.valueOf(Integer.parseInt(Inputoct.getText(), 8)); 
     Inputchar.setText(BF_Program.bytestochars(B.toByteArray())); 
     Inputhex.setText(B.toString(16)); 
     Inputdec.setText(B.toString(10)); 
     Inputbin.setText(B.toString(2)); 
    }); 

    Inputbin.textProperty().addListener(c -> { 
     BigInteger B = BigInteger.valueOf(Integer.parseInt(Inputbin.getText(), 2)); 
     Inputchar.setText(BF_Program.bytestochars(B.toByteArray())); 
     Inputhex.setText(B.toString(16)); 
     Inputdec.setText(B.toString(10)); 
     Inputoct.setText(B.toString(8)); 
    }); 

我怎样才能改变这种做法,编辑一个字段将一次而不是循环更新其他领域?谢谢。

回答

0

原来的方式,我有我的兰巴表达执行错误的类:InvalidationListener,当它应该使用的ChangeListener已经:

Inputchar.textProperty().addListener((observable, oldValue, newValue) -> { 
     char[] cs = Inputchar.getText().toCharArray(); 
     byte[] b = new byte[cs.length]; 
     for (int i = 0; i < cs.length; i++) { 
      b[i] = (byte) cs[i]; 
     } 
     BigInteger B = new BigInteger(b); 
     Inputhex.setText(B.toString(16)); 
     Inputdec.setText(B.toString(10)); 
     Inputoct.setText(B.toString(8)); 
     Inputbin.setText(B.toString(2)); 
    }); 

    Inputhex.textProperty().addListener((observable, oldValue, newValue) -> { 
     BigInteger B = BigInteger.valueOf(Integer.parseInt(Inputhex.getText(), 16)); 
     Inputchar.setText(BF_Program.bytestochars(B.toByteArray())); 
     Inputdec.setText(B.toString(10)); 
     Inputoct.setText(B.toString(8)); 
     Inputbin.setText(B.toString(2)); 
    }); 

    Inputdec.textProperty().addListener((observable, oldValue, newValue) -> { 
     BigInteger B = BigInteger.valueOf(Integer.parseInt(Inputdec.getText(), 10)); 
     Inputchar.setText(BF_Program.bytestochars(B.toByteArray())); 
     Inputhex.setText(B.toString(16)); 
     Inputoct.setText(B.toString(8)); 
     Inputbin.setText(B.toString(2)); 
    }); 

    Inputoct.textProperty().addListener((observable, oldValue, newValue) -> { 
     BigInteger B = BigInteger.valueOf(Integer.parseInt(Inputoct.getText(), 8)); 
     Inputchar.setText(BF_Program.bytestochars(B.toByteArray())); 
     Inputhex.setText(B.toString(16)); 
     Inputdec.setText(B.toString(10)); 
     Inputbin.setText(B.toString(2)); 
    }); 

    Inputbin.textProperty().addListener((observable, oldValue, newValue) -> { 
     BigInteger B = BigInteger.valueOf(Integer.parseInt(Inputbin.getText(), 2)); 
     Inputchar.setText(BF_Program.bytestochars(B.toByteArray())); 
     Inputhex.setText(B.toString(16)); 
     Inputdec.setText(B.toString(10)); 
     Inputoct.setText(B.toString(8)); 
    }); 

这一个实际工作。保持将来的参考。