zoukankan      html  css  js  c++  java
  • JPasswordField 中得到的字符数组转化为字符串(密码乱码问题)

    转载自:http://blog.csdn.net/skl_tz/article/details/9009805

    JPasswordField 用作密码的输入框,似乎很方便,但是,为了得到输入的内容,一般都会使用这样的方法去获取密码:


    [java] view plaincopy
    1. JPasswordField input_password = new JPasswordField();  
    2. String password = input_password.getPassword().toString();  


    这种方法比较合乎常理,因为input_password.getPassword() 方法得到的是一个字符数组,然而我想要的是一个字符串,于是,第一观感应该就是 toString()方法了,但是不可否认的是,toString之后的结果是乱码 ~ ~  


    乱码的原因:如果看下源码就知道,这里的toString()方法是继承自其父类Object的,它并没有重写这个方法,而Object 中的 toString()方法只是单纯的将字符数组强制转化为字符串,因此出现了乱码。官方api中也描述了这个事实

    Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

    getClass().getName() + '@' + Integer.toHexString(hashCode())


    解决方案

    [java] view plaincopy
    1. JPasswordField input_password = new JPasswordField();  
    2. String inputPassword = String.valueOf(input_password.getPassword());  
    使用String.valueOf( )可以有效的解决这个问题

    原因如下

    这个是官方的源码:

    [java] view plaincopy
    1. public static String valueOf(char data[]) {  
    2.     return new String(data);  
    3. }  

    从源码中可以看到,实际上valueOf()方法是通过new 一个String 对象来完成转化的

    官方api 是这样解释new String(char  data[ ])的:分配一个新的 String,使其表示字符数组参数中当前包含的字符序列,可以看到,new后的字符串实际是原来字符数组序列表示,这正是想要的结果  ^  ^


    也可用如下方式,效果是一样的,注意是TextField,而不是JTextField ,使用setEchoChar('*') 方法和上面的方法没有本质区别:

    [java] view plaincopy
    1. TextField input_password = new TextField();  
    2. input_password.setEchoChar('*');  
    3. String inputPassword = input_password.getText().trim();  


    虽然这只是一个小小的问题,但是只有好好解决了诸多小问题,才能解决更多由小问题组成的大问题 ~ ~


  • 相关阅读:
    Teamwork[HDU4494]
    The Parallel Challenge Ballgame[HDU1101]
    「JSOI2016」无界单词
    「SCOI2015」小凸玩密室
    #3636. IIIDX(iiidx)
    #2652. 背单词(word)
    「JXOI2017」加法
    拙者
    19.10.01 acm E:Lowest Common Ancestor
    #3391. big
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212031.html
Copyright © 2011-2022 走看看