Posts Tagged ‘ 查漏补缺 ’


Java查漏补缺3-Swing中的文本绑定监听

在做简单的Swing开发中,会经常遇到这样的情况,需啊监听文本框的内容的变化。比如一个最简单的例子就是如果登陆框中用户名和密码都不为空的时候,登陆按钮才被激活。

在查看事件的时候,很多人第一眼看到的就是InputMethod下面的caretPositionChanged和inputMethodTextChanged。无论从文档还是从函数名字来看,这两个函数似乎都是我们所需要实现的方法。可惜当你填满了里面的内容,DEBUG的时候,会发现无论如何你改变你的输入框的内容,根本都不会触发这两个事件。在Sun的论坛上,有个人回了这样一句话来解决这个问题:“A component will only receive input method events from input methods if it also overrides getInputMethodRequests to return an InputMethodRequests instance.”

不愿意为这个问题多纠结,给出解决方案就是使用DocumentListener。这个接口提供了三个方法来侦听所绑定的文本的内容。对于我们需要的监听对象,直接添加这个侦听器,并实行其中的方法即可。

Document doc1 = jTextFieldId.getDocument();
doc1.addDocumentListener(new DocumentListener() {
            String name;
            String pwd;

            public void insertUpdate(DocumentEvent e) {
                name = jTextFieldId.getText();
                pwd = new String(jPasswordFieldPassword.getPassword());
                if(!name.equals("") && !pwd.equals("")){
                    jButtonSignIn.setEnabled(true);
                } else {
                    jButtonSignIn.setEnabled(false);
                }

            }

            public void removeUpdate(DocumentEvent e) {
                name = jTextFieldId.getText();
                pwd = new String(jPasswordFieldPassword.getPassword());
                if(!name.equals("") && !pwd.equals("")){
                    jButtonSignIn.setEnabled(true);
                } else {
                    jButtonSignIn.setEnabled(false);
                }
            }

            public void changedUpdate(DocumentEvent e) {

            }
        });

Java查漏补缺2 - 等于判断

基础的只是大家都很清楚,对于原始类型如int, float,直接用==就可以比较。对于Class类型的,在Java中使用的是reference的比较,因此需要使用的是equals.

Integer a1 = new Integer(1);
Integer a2 = new Integer(1);
System.out.println(a1==a2); //false
System.out.println(a1.equals(a2)); //true

因此在上述代码中,尽管使用的看上去就是int,但是因为实际已经使用了Integer,所以单纯使用==是不能比较的。

对于自己定义的类型,如果直接使用equals来比较,将会同样返回非期望的值。因为新定义的类,一般不会去重写equals的方法,而会直接调用其父类的equals方法,将也是直接比较reference。如果我们需要比较自定义的类型的时候,只需要重写equals方法就可以了。

class MyClass{
        private int count;
        public MyClass(int a){
            this.count=a;
        }

    @Override
    public boolean equals(Object obj) {
        MyClass newmc = (MyClass)obj;
        return this.count==newmc.count ? true : false;
    }

MyClass m1 = new MyClass(1);
MyClass m2 = new MyClass(1);
System.out.println(m1==m2);
System.out.println(m1.equals(m2));

Java查漏补缺1-Binding时间

在编程语言中,有两种binding方式,一是在compile期间binding,被称作Early-binding,一种是在execute期间binding,被称作Late-binding。
在Java中,更多的采用的是Late-binding这种方式。要做一个比较好的解释,可以看看关于继承的例子。以下这段代码显示了一个很简单的继承关系,父类是Shape,子类是Circle和Rectangle,其中分别实现了各自的draw()方法。

public class Shape {
    public void draw(){
        System.out.println("Draw shape");
    }
}

public class Circle extends Shape{
    public void draw(){
        System.out.println("Draw circle");
    }
}

public class Rectangle extends Shape{
    public void draw(){
        System.out.println("Draw rectangle");
    }
}

public class Test {
    public static void main(String[] args){
            Shape shape = new Shape();
            shape.draw();
            Shape shape1 = new Rectangle();
            shape1.draw();
            Shape shape2 = new Circle();
            shape2.draw();
        }
}

在以上的示例中,我们在main函数中看到生成了三个分别是以上三个类的实例,但是它们共用了同样的Shape声明。这也就是Java最重要的多态的之所在。不过不是本文的重点,略过。我们发现既然三个实例享有同样的声明,在编译期间,编译器是无法判断到底每一个实例属于的是哪一个类,需要调用的是哪一个draw方法。而在执行期间,run-time会自动根据new关键字对应的类型,将其binding上。这就是所谓的late-binding。在传统的大多数非OOP语言中,early-binding占据绝大多数。总之,early-binding意味着在程序编译期间,运行时系统将确定需要调用的函数的地址,而late-binding则会在系统运行时根据当时情况动态决定。(在C++中,也支持类似的late-binding,不过需要显示的加以virtual关键字)

  • English Version

    • Cannot read Chinese? Please take a look at my English site, hope you can find more you need there!
  • 感谢支持

  • twitter

    facebook

    linkedin

  • Categories