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

时间:2015-12-30 12:32:19

标签: java swing user-interface

我一直在通过参考在线资源和练习来学习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 lgeneratenum()函数完全执行之前消失,这意味着actionPerformed()仍未完成执行但JFrame disappearsgeneratenum()在控制台上运行。只有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()适用于控制台。

1 个答案:

答案 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);

    }
}