我一直在通过参考在线资源和练习来学习java GUI(准确地说是摆动)。
代码:(p
是一个JButton)
p.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
System.out.println("Welcome to Guess the number Game");
System.out.println("You have 3 chances to guess a number between 0 and 10 excluding 10");
ne.remove(p);
ne.revalidate();
ne.repaint();
l.dispose(); //l is a JFrame
gamer2 game=new gamer2();
game.generatenum(); //works on the console
l.setVisible(true);
}});
问题:
java GUI
所做的任何更新/更改只有在actionPerformed()
完全执行后才会生效。但事情是l.dispose()
有效或Jframe l
在generatenum()
函数完全执行之前消失,这意味着actionPerformed()
仍未完成执行但JFrame disappears
。 generatenum()
在控制台上运行。只有button is removed
完全执行后才会actionPerformed()
,但为什么框架会有所不同。java control flows from line to line
(至少在上面的例子中)。JFrame reappers since I have written l.setVisible(true);
。但这是在generatenum()
完全执行之前发生的。如果我在控制台上输入合适的数字,generatenum()
将停止运行。那么在上一行/函数执行完成之前,控件如何跳转到l.setVisible(true)
。什么是generatenum()
?
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();
}
}
generatenum()
适用于控制台。
答案 0 :(得分:2)
框架visibillity cahnges(在dispose上设置为false)不在GUI消息循环中进行(对于AWT / Swing称为AWT Event-Dispatching Thread)。 使用以下测试程序,可以看到框架(窗口)消失,并在单击按钮一次后每秒重新开始。
帧上的所有内容(如测试程序中的按钮)都不会重新绘制,因为消息循环正忙。消息循环(参见上面的链接)是所有GUI事件实际执行的循环。在其他框架中,如WPF框架或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);
}
}