【发布时间】:2015-07-21 12:54:54
【问题描述】:
我写了一个打开 cd/dvd 的类(名为 Cdopener),我有另一个类(名为 Burn)扩展 Swingworker,它在它的 done() 方法中做了一些事情,我想做一个对象class 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 以便它打开 cd,为此我只是将这部分添加到我的代码中,以便在 Burn 类的 done() 部分中创建一个 Cdopener 对象:
Cdopener cdopener = new Cdopener();
但似乎有些东西应该改变,因为它不会以这种方式打开 cd!我应该如何在我的 done 方法中调用 Cdopener 类?
【问题讨论】:
-
首先,我不会在
Cdopener的 constructor 中包含所有代码(我会以不同的方式命名它,但这是另一回事) .您是否调试过代码以查看会发生什么?也许正在抛出异常? -
不,在构造函数中包含所有代码是没有问题的,我已经对其进行了调试,甚至我已经在另一个不扩展 Swingworker 的类的主体中创建了一个对象已经工作并打开了 cd,问题是当我想从扩展 Swingworker 的类的 done 方法中调用它时。 @JonSkeet
-
“不,在构造函数中包含所有代码是没有问题的” - 这是丑陋的设计。我并不是说它不能工作,只是它不是干净的代码。你还没有说出你在调试时观察到的在它导致问题的上下文中。
-
当调试到达 Burn.execute() 并且我按 f8 进入时,它可以工作并打开 cd,但是当我运行程序时它什么也没做! @JonSkeet
-
所以它在调试器下运行时可以工作,但在没有调试器运行时不行?如果您在调试器下运行但没有单步执行,它是否有效? (所有这些信息都应该在问题中,顺便说一句......)
标签: java object call swingworker cd