【问题标题】:How to call a class in the done() method of a class which extends Swingworker?如何在扩展 Swingworker 的类的 done() 方法中调用一个类?
【发布时间】: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 类?

【问题讨论】:

  • 首先,我不会在 Cdopenerconstructor 中包含所有代码(我会以不同的方式命名它,但这是另一回事) .您是否调试过代码以查看会发生什么?也许正在抛出异常?
  • 不,在构造函数中包含所有代码是没有问题的,我已经对其进行了调试,甚至我已经在另一个不扩展 Swingworker 的类的主体中创建了一个对象已经工作并打开了 cd,问题是当我想从扩展 Swingworker 的类的 done 方法中调用它时。 @JonSkeet
  • “不,在构造函数中包含所有代码是没有问题的” - 这是丑陋的设计。我并不是说它不能工作,只是它不是干净的代码。你还没有说出你在调试时观察到的在它导致问题的上下文中
  • 当调试到达 Burn.execute() 并且我按 f8 进入时,它可以工作并打开 cd,但是当我运行程序时它什么也没做! @JonSkeet
  • 所以它在调试器下运行时可以工作,但在没有调试器运行时不行?如果您在调试器下运行但没有单步执行,它是否有效? (所有这些信息都应该在问题中,顺便说一句......)

标签: java object call swingworker cd


【解决方案1】:

试试这个

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

【讨论】:

  • 尝试删除 myCdTrayOpener.deleteOnExit();并添加 System.out.print(myCdTrayOpener.getAbsolutePath()) 并检查它创建的实际文件
  • 再次没有任何变化。
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多