无模式JDialog不显示内容

Rie*_*ess 3 java user-interface swing jdialog modeless

(Java SE 6)我正在尝试创建一个弹出对话框,在我的程序执行一些时间密集的工作时显示"请稍候"消息.为此,我选择使用无模式JDialog,以便程序继续运行并在JDialog可见时工作(如果使用模态,程序将暂停,直到用户关闭对话框) .

问题是当你以这种方式使用无模式对话框时,会出现带有标题的JDialog,但内容却没有(我猜他们不会因为某些原因而被绘制).我试过调用重绘等,但似乎没有任何工作.

现在,根据网络上的一群人的说法,这是Swing的一个真正的错误,我发现的唯一答案是不以这种方式做事并找到一些通知用户等待的方法.我很好奇,如果有人在这里遇到过这个问题,并且已经找到了解决方法.

谢谢!

小智 5

这不是一个错误,你必须在主线程旁边的sepred线程中运行你的重量级工作和轻量级的工作.这是必要的,因为Dialog GUI Thread与ActionListenerEvents之间的逻辑关系与backround中的重量级作业有关.如果您没有单独使用主线程,则会因某些通知事件而确定Swing绘图.我有同样的问题,我试图监控FTP上传进度的进度,我从一个JFrame开始,在JDialog中显示它.

首先我试过:

//Activated by Upload Button
public void actionPerformed(ActionEvent e) {

    if("Upload".equals(e.getActionCommand())){

    // some Declarations

    new Thread(){

        public void run() {
            /*Run JDialog with the Upload - ProgressBar*/
            FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
        }
    }.start();

/*Run the heavy weigth Job - the Upload*/
ftpPersistence.uploadFile(localFile, remoteFile);

// ...
    }

//...

}
Run Code Online (Sandbox Code Playgroud)

但是这种方式我得到了一个JDialog FrameBorder和一个黑色内容窗格,但......

接下来尝试:

//Activated by Upload Button
public void actionPerformed(ActionEvent e) {

    if("Upload".equals(e.getActionCommand())){

    // some Declarations

    new Thread(){

        public void run() {
        /*Run JDialog with the Upload - ProgressBar*/
        FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
    }
}.start();


new Thread(){

    public void run() 
            /*Run the heavy weigth Job - the Upload*/
            ftpPersistence.uploadFile(localFile, remoteFile);
        }
    }.start();
    // ... 
    }
//...
}
Run Code Online (Sandbox Code Playgroud)

最后它工作,希望它会有所帮助;)