小弟正在用swing做个东西,代码如下:import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;public class test extends JFrame {

private JButton jButton_Update;
private JButton jButton_Finish;
private JDialog myDialog;
private int state; public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
test inst = new test();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}

public test() {
super();
initGUI();
}

private void initGUI() {
this.setResizable(false);
this.setSize(500, 400);
jButton_Finish = new JButton();
jButton_Finish.setText("完成");
jButton_Finish.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
dispose(); //点击子对话框上的完成按钮,子对话框关闭
}
}
);
jButton_Update = new JButton();
getContentPane().add(jButton_Update);
jButton_Update.setText("更新"); ActionListener updateTask = new ActionListener() {
public void actionPerformed(ActionEvent evt) { myDialog = new JDialog(); //点击主窗口上的更新按钮时,创建子对话框
myDialog.add(jButton_Finish); //完成按钮在子对话框中
jButton_Finish.setEnabled(false);  //开始工作时,完成按钮不可用
myDialog.setModalityType(JDialog.DEFAULT_MODALITY_TYPE);     //设子窗口为模态对话框
myDialog.setVisible(true); state = doMyJob(); //同时执行我的工作的逻辑,并返回1表示工作结束
if(state == 1){
     jButton_Finish.setEnabled(true); //工作结束时,完成按钮可用  
}
}
}; jButton_Update.addActionListener(updateTask);

}

public int doMyJob(){
return 1;
}


}现在问题在于: 子对话框设置为模态对话框后,把主Fram给屏蔽了,查了一下,貌似是主Fram的事件线程被子对话框接管了。应该怎么改才能实现现有程序的目的呢(点击更新->主窗口不可用,显示子窗口,继续我的工作->完成后通知子窗口)

解决方案 »

  1.   

    myDialog.setVisible(true);用线程启动
    new Thread(new Runnable() {
                        public void run() {
                            myDialog.setVisible(true);
                        }
                    }, "").start();
      

  2.   


    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;public class Test extends JFrame {
        
        private JButton jButton_Update;
        private JButton jButton_Finish;
        private JDialog myDialog;
        private int state;    public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                 Test inst = new Test();
                    inst.setLocationRelativeTo(null);
                    inst.setVisible(true);
                }
            });
        }
        
        public Test() {
            super();
            initGUI();
        }
        
        private void initGUI() {
            this.setResizable(false);
            this.setSize(500, 400);
            jButton_Finish = new JButton();
            jButton_Finish.setText("完成");
            jButton_Finish.addActionListener(
                new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                     myDialog.dispose();    //点击子对话框上的完成按钮,子对话框关闭
                    }
                }
            );        
            jButton_Update = new JButton();
            getContentPane().add(jButton_Update);
            jButton_Update.setText("更新");        ActionListener updateTask = new ActionListener() {
                public void actionPerformed(ActionEvent evt) {                myDialog = new JDialog();    //点击主窗口上的更新按钮时,创建子对话框
                    myDialog.add(jButton_Finish);    //完成按钮在子对话框中
                    myDialog.setSize(200,200);
                    myDialog.setVisible(true);    
                    jButton_Finish.setEnabled(false);  //开始工作时,完成按钮不可用
                    state = doMyJob();        //同时执行我的工作的逻辑,并返回1表示工作结束
                    
                    if(state == 1){
                         jButton_Finish.setEnabled(true);    //工作结束时,完成按钮可用  
                    }
                }
            };        jButton_Update.addActionListener(updateTask);    
            
        }
        
        public int doMyJob(){
         System.out.println("doing~~~~");
         try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
            return 1;
        }
            
            
    }
      

  3.   

     时间的灵敏度很高 你的doMyJob的业务时间只是return 1;这个语句 所以事件处理业务方法瞬间。瞬间你的肉眼不会发现按钮的变化。其实按钮先setEnabled(false); 然后setEnabled(true了); 
    还有这个你写的有问题   
      jButton_Finish.addActionListener(
                new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        dispose();    //点击子对话框上的完成按钮,子对话框关闭
                    }
                }
            );
    想一下dispose(); 关闭的是谁 //关闭的是原窗口而不是子窗口 ,要 myDialog.dispose(); 
      

  4.   


    doMyJob里有很多逻辑代码,在这里只是省去了而已关闭那个地方是我疏忽了。。我试试用线程调度
      

  5.   

    代码没问题啊 你看看我上面给你改好的代码啊方法里面加个 Thread.sleep(1000);
    线程休眠一下 你就知道了
      public int doMyJob(){
            System.out.println("doing~~~~");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {            
                e.printStackTrace();
            }
            return 1;
        }
            
      

  6.   

    OK了,Thanks!先给分,顺便问下,如果这个用swingworker做,程序结构应该怎么改呢?
      

  7.   

    swingworker(接触很少,不好意思)
      swing方面本来接触很少,java一般做web的开发。swing做大型的医疗等项目还是比较突出的