最近在做一个数据结构的课程设计遇上些麻烦,其中有个问题想了好几天还是没头绪的,于是只能上网求助各位了由于明儿要第一次演示程序的,而我又刚好在最后的一个坎给卡主了,所以希望大家能帮助我,我在线等的下面是我为了说明问题写的一个简易的小程序例子:
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 
import javax.swing.*;
 public class test03 extends JFrame implements ActionListener{
 
/**
  * @param args
  */
 JPanel p1;
 JLabel jlb;
 JButton jb1; public static void main(String[] args) {
 // TODO Auto-generated method stub
 test03 test03 = new test03 ();
 }
 
public test03(){ p1=new JPanel();
 p1.setBackground(Color.black);
 //p1.setLayout(new BorderLayout());
 jb1=new JButton("新建一个窗口");
jb1.addActionListener(this);
 p1.add(jb1); this.add(p1);
 
this.setSize(615, 473);
 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 this.setVisible(true);
 }
 
@Override
 public void actionPerformed(ActionEvent arg0) {
 // TODO Auto-generated method stub
 test04 test04 = new test04 ();
 }
 }
 
 class test04 extends JFrame implements ActionListener{
  JPanel p11;
 JLabel jlb1;
 JButton jb11; Boolean []bool=new Boolean[11];
 int cc=0;
int count=0;
 public test04(){
 for(int i=0;i<11;i++){
 bool[i]=true;
 }
 
p11=new JPanel();
 p11.setBackground(Color.black); jb11=new JButton("画图");
jb11.addActionListener(this);
 p11.add(jb11); this.add(p11); this.setSize(615, 473);
 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 this.setVisible(true);
 }
  public void paint(Graphics g) {
        super.paint(g);
      
     g.setColor(Color.green);
      
     while( bool[cc] ){
    try {
 Thread.sleep(2000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
      }
cc++;
      g.fillOval(10, 10, 10, 10);
                        while( bool[cc] ){
    try {
 Thread.sleep(2000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
      }
 cc++;
     g.fillOval(91, 105, 10, 10);
                         while( bool[cc] ){
    try {
 Thread.sleep(2000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
      }
 cc++;
     g.fillOval(119, 260, 10, 10);
                         while( bool[cc] ){
    try {
 Thread.sleep(2000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
      }
 cc++;
                      g.fillOval(243, 266, 10, 10);
      g.fillOval(210, 157, 10, 10);
      g.fillOval(332, 142, 10, 10);
      
     while( bool[cc] ){
    try {
 Thread.sleep(2000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
      }
 cc++;
     g.drawLine(10, 10,91, 105);
                         while( bool[cc] ){
    try {
 Thread.sleep(2000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
      }
 cc++;
     g.drawLine(91, 105,119, 260);
      g.drawLine(119, 260,243, 266);
      g.drawLine(243, 266,210, 157);
      g.drawLine(210, 157,332, 142);
      
     
     
 }
 @Override public void actionPerformed(ActionEvent arg0) {
 // TODO Auto-generated method stub
 
 bool[count] = false;
count++;
 }
  }
 
这个例子程序中一旦打开第二个界面后就出现死循环了,导致其他按钮失效了,有没有办法是是按钮不失效的,如果按钮能继续工作,就可以分步控制画线和点了(这里单步控制画线只是单纯为了说明问题的) 

解决方案 »

  1.   

    抱歉的~·抱歉的·
    您的提醒才让我发现自己太粗心了~·
    真的要谢谢您抽空帮我的~·我想表达的是在第二个界面中,每按下一次按钮就画一次点或线,实现单步效果,按钮每被点击一次就改变bool[cc]的布尔值,然后跳出死循环然而运行结果却是打开第二个界面后直接进入死循环,按钮失效了,以致于不能改变bool[cc]的值,从而死循环所以我想问问您们有什么办法可以解决这个问题的。。这个图形界面程序可以用线程的知识解决吗。。(由于刚接触JAVA,线程的知识不算很熟的。。如果可以希望给予指导)
      

  2.   

    抱歉的~·抱歉的·
     您的提醒才让我发现自己太粗心了~·
     真的要谢谢您抽空帮我的~·
     
    我想表达的是在第二个界面中,每按下一次按钮就画一次点或线,实现单步效果,按钮每被点击一次就改变bool[cc]的布尔值,然后跳出死循环然而运行结果却是打开第二个界面后直接进入死循环,按钮失效了,以致于不能改变bool[cc]的值,从而死循环所以我想问问您们有什么办法可以解决这个问题的。。
     
    这个图形界面程序可以用线程的知识解决吗。。(由于刚接触JAVA,线程的知识不算很熟的。。如果可以希望给予指导)
      

  3.   

    =====================================
    在另一个里面我已经回复你了,GUI界面是单线程的,如果你不让操作退出来是做不了第二次操作的。
    当做完一次操作,不要停在while(true)里面了。虽然你用的是变量,改变不了变量还是一个死循环。
    操作了一步后,ruturn返回,记录第一步已经做了,当按钮再发送一次时,再执行下一步。