Java 如何在扩展Swingworker的类的done()方法中调用类?

Java 如何在扩展Swingworker的类的done()方法中调用类?,java,object,call,swingworker,cd,Java,Object,Call,Swingworker,Cd,我已经编写了一个打开cd/dvd的类(名为Cdopener),我还有一个扩展Swingworker的类(名为Burn),它在它的done()方法中做了一些事情,我想创建一个类Cdopener的对象,以便在Burn类运行时打开cd 这是我的Cdopener课程: import java.awt.Desktop; import java.io.File; import java.io.PrintWriter; public class Cdopener { public Cdopener

我已经编写了一个打开cd/dvd的类(名为Cdopener),我还有一个扩展Swingworker的类(名为Burn),它在它的done()方法中做了一些事情,我想创建一个类Cdopener的对象,以便在Burn类运行时打开cd

这是我的Cdopener课程:

import java.awt.Desktop;

import java.io.File;
import java.io.PrintWriter;

public class Cdopener {
    public Cdopener() {
        try {
            //********Start VBScript code to open cd tray************
            String a = "Set oWMP = CreateObject(\"WMPlayer.OCX\")" + "\n" 
                + "Set colCDROMs = oWMP.cdromCollection" + "\n" 
                + "For d = 0 to colCDROMs.Count - 1" + "\n" 
                + "colCDROMs.Item(d).Eject" + "\n" 
                + "Next" + "\n" 
                + "set owmp = nothing" + "\n" 
                + "set colCDROMs = nothing" + "\n" 
                + "wscript.Quit(0)";
            //********End VBScript code to open cd tray************

            //Create a vbscript file called OpenCdTray.vbs
            File myCdTrayOpener = new File("OpenCdTray.vbs");

            //Create a PrintWriter object that will use to write into created file
            PrintWriter pw = new PrintWriter(myCdTrayOpener);

            //Write all string in (a) into created file
            System.out.println(a);
            pw.print(a);

            //Flush all resource in PrintWriter to make sure
            //there are no data left in this stream.
            pw.flush();

            //Close PrintWriter and releases any
            //system resources associated with it
            pw.close();

            //Create a Desktop object to open created vbs file(OpenCdTray.vbs).
            //It will open using default application that will use
            //to handle this file in targeted computer.
            //True application to run this file is wscript.exe
            Desktop.getDesktop().open(myCdTrayOpener);

            //Delete created vbs file before terminate application
            myCdTrayOpener.deleteOnExit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}
这是Burn类的方法done():

protected void done() {

    taskProgressBar.setIndeterminate(false);

    if (this.error.length() == 0) {
        taskProgressBar.setValue(100);
        taskProgressBar.setString("Done");
    }

    // this.resultLbl.getText() +"\n"+getUserName();
    addLog(resultLbl.getText());
    // super.done();
}
Cdopener cdopener = new Cdopener();
我想调用Cdopener以便它打开cd,为此,我只需将此部分添加到代码中,在Burn类的done()部分中创建Cdopener的对象:

protected void done() {

    taskProgressBar.setIndeterminate(false);

    if (this.error.length() == 0) {
        taskProgressBar.setValue(100);
        taskProgressBar.setString("Done");
    }

    // this.resultLbl.getText() +"\n"+getUserName();
    addLog(resultLbl.getText());
    // super.done();
}
Cdopener cdopener = new Cdopener();
但似乎有些东西应该改变,因为它没有以这种方式打开cd!我应该如何在done方法中调用类Cdopener?

试试这个

Desktop.getDesktop().open(新文件(myCdTrayOpener.getAbsolutePath());
打开vbs文件以确保它指向正确的文件目录。

首先,我不会在
Cdopener
的构造函数中包含所有这些代码(我会给它起不同的名字,但这是另一回事)。你有没有调试代码看看会发生什么?可能引发了异常?不,在构造函数中包含所有代码没有问题,我已经调试了它,甚至我在另一个类的主类中创建了一个对象,该类不扩展Swingworker,它已经工作并打开了cd,问题是当我想从扩展Swingworker的类的done方法调用它时@JonSkeet“不,把所有的代码都放在构造函数中是没有问题的”-这是一个丑陋的设计。我不是说它不能工作,只是它不是干净的代码。你还没有说你在上下文中调试时观察到的是什么导致了问题。当调试时,当它到达Burn.execute()并且我按f8键进入时,它会工作并打开cd,但当我运行程序时,它不会做任何事情@JonSkeetSo它在调试器下运行时工作,但在没有调试器的情况下运行时不工作?如果您在调试器下运行,但没有单步执行,它是否有效?(所有这些信息都应该在问题中,顺便说一下…)尝试删除myCdTrayOpener.deleteOnExit();添加System.out.print(myCdTrayOpener.getAbsolutePath())并检查创建的实际文件是否没有任何更改。