关于Java GUI和Java中的控制流的一些疑问

关于Java GUI和Java中的控制流的一些疑问,java,swing,user-interface,Java,Swing,User Interface,通过参考在线资源和实践,我一直在学习JavaGUI(准确地说是swing)。 代码:(p是一个JButton) 问题: 在我之前发布的一些相关问题中,我了解到对javagui所做的任何更新/更改只有在actionPerformed()完全执行后才会生效。但是问题是,l.dispose()工作,或者Jframe l甚至在generatenum()函数完全执行之前就消失了,这意味着actionPerformed()仍然没有完成执行,但是Jframe消失了generatenum()在控制台上运行。问

通过参考在线资源和实践,我一直在学习JavaGUI(准确地说是swing)。 代码:(p是一个JButton)

问题:

  • 在我之前发布的一些相关问题中,我了解到对
    javagui
    所做的任何更新/更改只有在
    actionPerformed()
    完全执行后才会生效。但是问题是,
    l.dispose()
    工作,或者
    Jframe l
    甚至在
    generatenum()
    函数完全执行之前就消失了,这意味着
    actionPerformed()
    仍然没有完成执行,但是
    Jframe消失了
    generatenum()
    在控制台上运行。问题是只有在
    actionPerformed()
    完全执行之后,
    按钮才会被删除,但为什么在帧的情况下会有所不同呢
  • 我还知道
    java控件从一行流向另一行(至少在上面的示例中是这样)。但这是在
    generatenum()
    完全执行之前发生的。只有在控制台上输入合适的数字,
    generatenum()
    才会停止运行。那么,在上一行/函数执行完成之前,控件如何跳到
    l.setVisible(true)
什么是
generatenum()


generatenum()
在控制台上工作。

帧可见性cahnges(dispose时设置为false)不在GUI消息循环中发生(为AWT/Swing调用)。 使用下面的测试程序,您会看到帧(窗口)消失,并在单击按钮一次后每秒重新出现

帧上的所有内容(如测试程序中的按钮)都不会重新绘制,因为消息循环正忙。消息循环(参见上面的链接)是所有GUI事件实际执行的循环。在其他框架中,如WPF framework或WinForms for C#或SWT for Java,如果从另一个线程访问GUI,则会出现异常

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main {

    public static void main(String[] args) {
        final JFrame f1=new JFrame();
        f1.setBounds(100,100,100,100);
        final Button b = new Button();
        b.setLabel("Test");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e1) {
                while(true){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    f1.setVisible(!f1.isVisible());
                }
            }
        });
        f1.add(b);
        f1.setVisible(true);

    }
}

GenerateEnum()是否可以在另一个线程中执行某些操作?没有GenerateEnum()中的代码,任何人都无法提供帮助;)。我将添加
generatenum()
code…:)@MikeyOK generatenum()是一个错误的猜测:看到我的答案了吗?你能再加一点解释吗?…比如GUI消息循环是如何工作的?…你所说的
帧上的所有内容(比如按钮)都不会被绘制,因为消息循环很忙。
?…你能解释一下我的问题吗?。请!添加了一些解释和链接:希望它能帮助Sokay。我明白了。但问题是
设置可见性开/关在EDT中不起作用。它在哪里运行?…在我的情况下…按钮的删除只有在
操作()执行后才起作用
已完全执行,但
打开/关闭可见性设置在此之前起作用。
您能解释一下这个特定问题吗?我不确定,但我认为帧的可见性更改会传输到操作系统的窗口管理器,并且可以立即执行(在其他操作系统上可能会有不同的行为)。另一方面,移除按钮是框架上的一个变化:因此它必须等待EDT。哇……非常感谢@Mikey。此评论回答了我的问题和你的答案,你提供的链接非常有用。
It is a function which accepts user input on the Eclipse console.It doesn't stop running unless it receives a valid input from the user.
void generatenum() 
{
    int ran=(int)(Math.random()*10);
    System.out.println("For developer-no.selected "+ran);
    getUserInput(ran);

}

void getUserInput(int k)
{

    i++;
    System.out.println("print now-Chance "+i);

    g.gotValue=k;
    InputStreamReader j=new InputStreamReader(System.in);
    BufferedReader s=new BufferedReader(j);
    try {
        int getIt1=Integer.parseInt(s.readLine());

        g.getIt=getIt1;
    }  catch (IOException e) 
    {
     e.printStackTrace();
        }
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main {

    public static void main(String[] args) {
        final JFrame f1=new JFrame();
        f1.setBounds(100,100,100,100);
        final Button b = new Button();
        b.setLabel("Test");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e1) {
                while(true){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    f1.setVisible(!f1.isVisible());
                }
            }
        });
        f1.add(b);
        f1.setVisible(true);

    }
}