关于Java GUI和Java中的控制流的一些疑问
通过参考在线资源和实践,我一直在学习JavaGUI(准确地说是swing)。 代码:(关于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()在控制台上运行。问
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);
}
}