2013-07-04 63 views
-1

我刚开始学习Java 1周前,我是一个100%完全初学者。在这段代码中,我似乎无法将一个actionlistener /得到一个工作。尽管读了几十篇教程,我甚至不知道在哪里/如何/以何种方式放置它。我创建了一个带有JPanel的JFrame,并在JPanel上有一个按钮。到目前为止这么好(和工作)。但是,我希望它是这样的,如果按钮被点击,另一个按钮会出现。谢谢你sooo提前!Java actionlistener不起作用

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.*; 
import java.awt.event.*; 
public class Skeleton extends JFrame implements ActionListener { 

    public static void main(String[] args) { 
    //------------------------------------------------ 
    JFrame frame = new JFrame("Skeleton"); 
    JPanel panel = new JPanel(); 
frame.setContentPane(panel); 
    frame.setSize(600,600); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    JButton button = new JButton("This is a button."); 
    JButton button2 = new JButton("Hello"); 
    panel.setLayout(null); 
    button.setBounds(20,20,200,25); 
    button2.setBounds(20,70,200,25); 
    panel.add(button); 
    //------------------------------------------- 

button.addMouseListener(this); 


} 

public void ActionPerformed(ActionEvent e) { 
    System.out.println("Hello"); 

} 
} 

回答

2

您需要添加actionlistener。

将事件处理程序类的实例注册为一个或多个组件上的侦听器。例如:

yourdesiredcomponent.addActionListener(this); 

欲了解更多详细信息,请检查doc

+0

谢谢你Stine –

4

我会给你一些建议

1)不要在顶部类实现ActionListener,使用匿名类或私有类来代替。

例子:

匿名类(也称摇摆动作)

myComponent.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent evt){ 
       //code here 
     } 

}) 

//inner class 
public class Skeleton{ 

// in some part 
private class MyActionListener implements ActionListener{ 
     public void actionPerformed(ActionEvent evt){ 
      //code here 
     } 
} 


} 

2)您的代码将无法编译,因为你没有实现ActionListener接口

public void actionPerformed(ActionEvent evt)是签名。

你必须addActionListener到您的组件

button.addActionListener(this);

3)不要使用空布局,因为你将有一个很大的问题,如果你想添加更多的组件或调整窗口的大小,因为你必须手动输入setBounds,这将令人沮丧,而不是使用[Layout Manager][1]

4)尝试不扩展JFrame如果不是必要的,而是在你的类中有一个引用,例如。

public class Skeleton{ 

    private JFrame frame; 

    } 
+0

+1。但是我对你的4th点感到不舒服。它总是一个很好的方式来扩展JFrame收获其最大的好处.. – Mac

+1

@Mac如果你想添加更多级别的继承,我认为与组成你可以做同样的..至少你想重写一些方法,例如paint ..在这种情况下,你也可以使用匿名类。 – nachokk

+0

但是,如果有一个模块将成为整个项目的标准,那么创建一个新的自定义类将通过提供单个模块来最大限度地减少大量冗余你可以在同一个项目的其他类中扩展(** REUSE **),而不必担心基本规则。 – Mac