朋友问的一个问题,结果自己晕了。
下面的代码希望实现点击一个按钮后,弹出一个对话框,对话框中另外有一个按钮,在点击对话框中按钮之前,原线程一直等待。他想用while(i == 1)实现(点击对话框中按钮后i = 0),但却发现对话框一片空白。
我查了很久,最后发现与while(i == 1)的位置有关,如果不去掉注释,则运行正常。否则,对话框一片空白。个人感觉与GUI线程有关,请大家帮忙看一下。import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class Test extends JFrame
{
int i = 1;

void testWhile()
{
System.out.println(Thread.currentThread());
new Thread()
{
public void run()
{
System.out.println(Thread.currentThread());

final JFrame info = new JFrame();
JButton b = new JButton("Test");
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
i = 0;
System.out.println("dispose");
info.dispose();
}
});
info.add(b);
info.pack();
info.setVisible(true);

while(i == 1)
{
try
{
Thread.sleep(1);
}
catch(Exception ex)
{
}
}
}
}.start();
/*while(i==1)
{
try
{
Thread.sleep(1);
}
catch(Exception ex)
{
}
}*/
}

public Test()
{
JPanel test = new JPanel();
JButton b = new JButton("Test");
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
testWhile();
}
});
test.add(b);
add(test);
setPreferredSize(new Dimension(800, 700));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}

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

解决方案 »

  1.   

    问楼主,你知道你注释放开了之后 sleep的是哪个线程么?是你的主线程,你的主线程一直sleep,它什么都干不了了
      

  2.   

    顺便问一下,为什么要sleep呢,为什么呢为什么呢?
      

  3.   

    package com.huasai.sig.general.report.model.vo;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class Test extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L; void testWhile() {
    System.out.println(Thread.currentThread());
    new Thread() {
    public void run() {
    System.out.println(Thread.currentThread()); final JFrame info = new JFrame();
    JButton b = new JButton("Test");
    b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    System.out.println("dispose");
    info.dispose();
    }
    });
    info.add(b);
    info.pack();
    info.setVisible(true);
    }
    }.start();

    } public Test() {
    JPanel test = new JPanel();
    JButton b = new JButton("Test");
    b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    testWhile();
    }
    });
    test.add(b);
    add(test);
    setPreferredSize(new Dimension(800, 700));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
    } public static void main(String[] args) {
    new Test();
    }
    }感觉良好
      

  4.   

    首先了解 Java所有的界面响应操作都是在一个叫AWT-EventQueue的线程中运行.如果一个操作在AWT-EventQueue线程中运行时间长了就会造成程序假死。此程序就是如此。看主Frame的test安装调用testWhile()方法,那么testWhile方法都占用AWT-EventQueue线程时间,然而testWhile方法另起的线程就不占AWT-EventQueue线程时间,当while循环再外面时,testWhile方法锁住了AWT-EventQueue线程,就会造成界面不刷新的情况。让用户感觉是假死状态。
      

  5.   

    看主Frame的test安钮调用testWhile()方法,
      

  6.   

    可以参考 Swing Hacks No.58 不通过模态对话框实现窗口堵塞
      

  7.   

    6楼提到的,补充:
    event-dispatching thread:事件分发线程event-dispatching thread是一个执行绘画与事件处理代码的线程,比如paint和actionPerformed方法就会自动在event-dispatching thread中被执行,当actionPerformed中执行流程被阻塞,paint会因为没有被执行而导致界面不刷新