0

假设我有一个class被调用的面板

 public class Panel extends JPanel implements ActionListener{
       public Board(){
            setFocusable(true);
            setBackground(Color.black)
            setDoubleBuffered(true);
            timer= new Timer(16,this);
            timer.start();
       }
       public void actionPerformed(ActionEvent e){
            //.........some codes here...//

       }
       public void render(Graphics2D g){
            //....some code here....//
       }
}

我在 main 中运行它class

public class Main extends JFrame{
public Main(){
    add(new Panel());
    //....some code....//
}
public static void main(String[] args){
    new Main();
}
}

因为actionPerformed()render()方法不在构造函数中。

4

7 回答 7

2

当您创建一个新对象时,只会执行构造函数(以及它调用的任何方法)。通常,方法仅在您的代码或框架调用时才运行(通常是为了响应事件——在您的情况下,事件是Timer延迟时间的流逝)。

请注意,您最初发布的代码中有错字:

public void actionPerfomred(ActionEvent e){

应该

public void actionPerformed(ActionEvent e){

如果你用 注释被覆盖的方法@Override,编译器会为你捕获这样的错误。这样你就不必在运行时弄清楚为什么你的方法没有被调用。

于 2013-08-21T04:38:50.717 回答
0

它显然只会调用构造函数。如果您没有任何构造函数,则编译器将调用默认的空构造函数。但是当你只创建一个对象并且只调用构造函数时。

于 2013-08-21T04:44:38.043 回答
0

Java 只会运行构造函数。我还注意到 Panel 类的构造函数名称与其构造函数不匹配。它必须是相同的名称。而不是这个

public class Panel extends JPanel implements ActionListener{
       public Board(){
            setFocusable(true);
            setBackground(Color.black)
            setDoubleBuffered(true);
            timer= new Timer(16,this);
            timer.start();
       }

}

你做

public class Panel extends JPanel implements ActionListener{
   public Panel(){
        setFocusable(true);
        setBackground(Color.black)
        setDoubleBuffered(true);
        timer= new Timer(16,this);
        timer.start();
   }
}

同样关于actionPerformed 事件方法,您必须手动将它们与您必须执行某些操作的按钮/列表连接起来。

于 2013-08-21T04:45:54.873 回答
0

但是调用actionPerformed方法时没有写在构造函数中。

现在这是一个更好的问题。这是您第一次提出问题时应该说明的行为,因此我们不会猜测您为什么提出这个问题。

那是因为您使用的是Timer. 当 Timer 触发ActionListener添加到 Timer 时会被调用。您的类实现了 ActionListener,因此actionPerformed()您的类的方法被调用。

于 2013-08-21T04:47:46.007 回答
0

它只会调用构造函数。

java是要运行构造函数还是整个类?

不 。它不会运行整个班级。

此外,当类加载时,它会运行静态块内的东西(如果有的话)。

于 2013-08-21T04:53:07.327 回答
0
if i create a new object and put it in the main method, is java going to run
the constructor or the entire class?

首先,您所说的 java 将要运行是什么意思。javac每当您使用类名调用时,例如javac *.java,您的所有 java 文件都将被编译为中间字节码。现在,当您调用java 解释器时,将从函数java Main开始解释您的字节码。public static void main(String args[])Java 只是一种编程语言的名称,你可以说是jvm going to execute the constructor or the entire class?

其次,执行整个课程是什么意思。这有两个方面

  1. Creating new object:每当您创建一个新对象(通过使用关键字new)时,都会调用相应的构造函数并创建该对象。当构造函数被执行时,如果您从构造函数调用任何方法,那么它们也将被执行。
  2. Calling function/methods:如果您的方法不是私有的,那么您可以在创建对象后调用这些方法(取决于使用的访问修饰符)。

你的情况

new Panel();

创建了新的 Panel 对象(调用了相应的构造函数)。不会自行执行其他方法。

my question is that render and actionPerformed are not in the constructor,
how are they being executed? it is because of Timer?

这是你不应该问的问题。你是程序员,你必须为你的要求编写代码。至于用例,我可以告诉你

   public void actionPerformed(ActionEvent e){
        //.........some codes here...//

   }

您可以创建一个 JButton 或任何 Component 并向其添加一个 ActionListner。ActionListner 有这个方法。由于您的 Panel 类实现了 ActionListner,因此您正在实现函数 actionPerformed()。例如。

    JButton button = new JButton();
    button.addActionListener(new Panel());
于 2013-08-21T05:11:12.333 回答
0

actionPerformed将通过计时器触发器调用。

render方法不会被调用。如果你想在摇摆中画一些东西JPanel,应该覆盖paint(Graphics g)定义在JComponent.

看看http://docs.oracle.com/javase/tutorial/uiswing/index.html

于 2013-08-21T05:49:38.617 回答