2013-07-11 63 views
1

因此,通常我是C,C++和C#程序员,在C#WPF中拥有大部分GUI经验。我已经被安置在一个使用Java的项目上,并且我发现我的词汇表对于C#而言并不能很好地与Java混合使用。Java操作说明

一个问题我已经遇到涉及Jbutton将,想必已经被称为在C#“代表”什么。从这个example有这段代码:

jbnButton1.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     jtfInput.setText("Button 1!"); 
    } 
}); 

简单地说,这是什么所谓的,其中一个函数定义为一个参数(或作为参数传递)?另外,这是最佳做法吗?在我所开发的项目中,Initialize()函数充满了像按钮,复选框等这样的函数,这使得它变得非常不易操作。我更喜欢在类级别定义,而不是在Initialize()中。

这让我想起另一个example(上面的代码示例)。与这些代码行:

b1.addActionListener(this); 
    b3.addActionListener(this); 
... 
} 

public void actionPerformed(ActionEvent e) { 
    if ("disable".equals(e.getActionCommand())) { 
     b2.setEnabled(false); 
     b1.setEnabled(false); 
     b3.setEnabled(true); 
    } else { 
     b2.setEnabled(true); 
     b1.setEnabled(true); 
     b3.setEnabled(false); 
    } 
} 

实质上,代码分配为按钮一次,b1和按钮3的动作,b 3分配给相同的事件处理程序,这是在我更喜欢的范围限定(外部的,其中按钮正在初始化)。有没有办法让它们指向不同的功能?另外,通过调用

.addActionListener(this); 

编译器如何计算出在此使用actionPerformed(ActionEvent e)?是预先定义的行动将解决'actionPerformed(ActionEvent e)'?

+0

:这是当前类,它必须实现ActionListener接口。编译器不会“找出”使用actionPerformed。相反,addActionListener要求参数实现ActionListener接口,其中包含actionPerformed()方法。使用ActionEvent.getSource()来确定是否单击了b1或b3,然后从actionPerformed方法调用适当的方法。 – DwB

回答

1

你的第一个例子称为匿名类。它通常用于听众(如ActionListener s),但只能在您不必删除侦听器时使用,因为没有参考被保存。

对于问题的第二部分,编译器不搞清楚何时调用actionPerformed。它是在ActionListenerdocumentation声明:

当动作事件发生时,该对象的actionPerformed方法被调用。

因此,它是JButton有责任呼吁每当动作发生已添加到它的所有ActionListener小号actionPerformed

没有办法使b1b3指向不同的方法。这是其中一个匿名类将使一个更好的设计一个很好的例子:

b1.addActionListener(new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     b2.setEnabled(false); 
     b1.setEnabled(false); 
     b3.setEnabled(true); 
    } 
}); 

b3.addActionListener(new ActionListener() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     b2.setEnabled(true); 
     b1.setEnabled(true); 
     b3.setEnabled(false); 
    } 
}); 

假设b1有拉布勒“禁用”。然后this将不再需要执行ActionListener

1

你给第一个例子被称为“匿名内部类”。您所定义的ActionListener一个匿名子类,覆盖其actionPerformed方法,实例化它(创建这个子类的实例),然后传递引用该实例的方法jbnButton1.addActionListener。这是迄今为止最接近“关闭”的Java(至少在Java 8之前)。

这是惯用的时候,动作监听器很简单,但你可以重新编写此作为

class MyListener extends ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     jtfInput.setText("Button 1!"); 
    } 
} 
... 
jbnButton1.addActionListener(new MyListener()); 

但你可能要安排一个构造MyListener接受并保存jtfInput参考。内联定义简化了这一点。但是对于更复杂的情况,你可能想要在线外定义这个类。

至于第二个问题:

.addActionListener(this); 

其中这似乎必须实现ActionListener界面,所以它必须具有actionPerformed()方法的类。这就是让框架“知道”要调用什么的东西。

1

你的第二个代码示例:

它知道,因为你使用添加actionlistener -s到按钮类实现该接口ActionListener

使用该actionperformed(),如果你传递给addActionListener方法自己的类(本),您必须实现actionPerformed方法,它的工作原理就像anonymous classes,因为它是一个ActionListener

addActionListener方法知道s它有一个actionPerformed方法(它必须有一个),所以它会自动调用你的第二个问题的