Java actionPerformed执行后会发生什么?

Java actionPerformed执行后会发生什么?,java,swing,Java,Swing,执行操作执行后会发生什么?在执行actionPerformed之后,有没有办法返回程序的主类 以下是代码示例: public final class JavaGame extends JFrame { public JavaGame(){ int x = cache(); JButton butt = new JButton("NEW"); newG gameX = new newG(); butt.addActionL

执行
操作执行后会发生什么?在执行
actionPerformed
之后,有没有办法返回程序的主类

以下是代码示例:

public final class JavaGame extends JFrame {

    public JavaGame(){
        int x = cache();
        JButton butt = new JButton("NEW");

        newG gameX = new newG();
        butt.addActionListener(gameX);
    }

    public class gameFunction implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
            if(e.getSource() == butt){
                //do something logic here. Like go to another stage of the game
                JOptionPane.showMessageDialog(null, Success!");
            }
        }
    }

    public cache(){
        return 1;
    }

    public static void main(String[] args) {
        new JavaGame();
    }

}
运行
actionPerformed
后,接下来会发生什么


在我的真实代码中,
actionPerformed
运行后,我的游戏阶段仍然是一样的。如何返回到
main
,以便在不关闭和再次打开程序的情况下开始新阶段

在主视图中,您将显示JFrame:

new JavaGame().setVisible(true);
然后你从主机场回来

在后台有一个线程正在运行,称为EDT,事件调度线程。 在该线程上,可以处理按钮单击、重新绘制等操作

这应该在短时间内完成,以保持用户界面的响应性,而不是冻结

因此,您需要使用事件驱动:您通常可以为某些特定事件添加侦听器,如关闭JFrame、菜单项和按钮。这些侦听器由指定发生了什么的事件对象调用。你打电话给addActionListener

控制流程是保持按钮点击的响应性,稍后再做艰苦的工作:

@Override
public void actionPerformed(ActionEvent evt) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JavaGame.this.createANewAvatar();
        }
    });
}
然后在某个地方有一个

private void createNeewAvatar() { ... }

这一难以遵循的控制流(因为支离破碎)需要良好的命名和有组织的源。

在主要部分,您展示了JFrame:

new JavaGame().setVisible(true);
然后你从主机场回来

在后台有一个线程正在运行,称为EDT,事件调度线程。 在该线程上,可以处理按钮单击、重新绘制等操作

这应该在短时间内完成,以保持用户界面的响应性,而不是冻结

因此,您需要使用事件驱动:您通常可以为某些特定事件添加侦听器,如关闭JFrame、菜单项和按钮。这些侦听器由指定发生了什么的事件对象调用。你打电话给addActionListener

控制流程是保持按钮点击的响应性,稍后再做艰苦的工作:

@Override
public void actionPerformed(ActionEvent evt) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JavaGame.this.createANewAvatar();
        }
    });
}
然后在某个地方有一个

private void createNeewAvatar() { ... }

这个难以遵循的控制流(因为不完整)需要一个好的命名和有组织的源。

作为一个具体的例子,这个简单的例子包括一个重置按钮,在游戏模型上调用
Reset()
。侦听视图将
arg的
null
值视为相应更新显示的信号


作为一个具体的例子,这个简单的例子包括一个重置按钮,在游戏模型上调用
Reset()
。侦听视图将
arg的
null
值视为相应更新显示的信号


我讨厌不成熟,但如果(例如getSource()==butt)lol。GUI应用程序不是这样工作的。您只需启动它并继续处理分派给侦听器的事件。因此,当actionperformed终止时,除了等待下一个事件的应用程序外,不会再发生任何其他事情。我认为您将从中受益匪浅,或者至少从和部分中受益匪浅。顺便说一下,我认为这本身就是一个不错的问题,但我认为您应该删除“在我的真实代码中,在actionPerformed运行之后,我的游戏阶段仍然是一样的。我怎样才能回到main,这样我就可以开始一个新的阶段,而不必再次关闭和打开程序?“分开,让问题单独存在。这里没有足够的信息来诊断您的实际游戏中的问题,这可能有不同的原因,如果存在这些问题,您的问题可能会被关闭。如果你在阅读了这里的答案后仍然有问题,我建议你提出一个新的问题。我讨厌不成熟,但是如果(e.getSource()==butt)lol。这不是GUI应用程序的工作方式。您只需启动它并继续处理分派给侦听器的事件。因此,当actionperformed终止时,除了等待下一个事件的应用程序外,不会再发生任何其他事情。我认为您将从中受益匪浅,或者至少从和部分中受益匪浅。顺便说一下,我认为这本身就是一个不错的问题,但我认为您应该删除“在我的真实代码中,在actionPerformed运行之后,我的游戏阶段仍然是一样的。我怎样才能回到main,这样我就可以开始一个新的阶段,而不必再次关闭和打开程序?“分开,让问题单独存在。这里没有足够的信息来诊断您的实际游戏中的问题,这可能有不同的原因,如果存在这些问题,您的问题可能会被关闭。如果你在阅读了这里的答案后仍然有问题,我建议你提出一个关于这个问题的新问题。
JavaGame.this
指的是什么?gameFunction?这里有许多嵌套类:
JavaGame。这个
类似于对象的一个隐式字段。它还有一个
Runnable。通过
JavaGame。您可以访问JavaGame对象的成员(方法、字段)。一般来说,您可以省去它,只需调用
createANewAvatar()
JavaGame是指什么?gameFunction?这里有许多嵌套类:
JavaGame。这个
类似于对象的一个隐式字段。它还有一个
Runnable。通过
JavaGame。您可以访问JavaGame对象的成员(方法、字段)。通常,您可以省去它,只需调用
createANewAvatar()