隐藏到SystemTray时Java线程停止

对于我的父母,我正在编写一个简单的程序,将文件从数码photocamera复制到“我的文档”文件夹。他们总是需要我的帮助(他们不是那么技术先进)从相机上取下他们的照片所以我决定帮助他们。我称之为复印机。由于我在Java中找不到合适的USB-Listener,我自己写了一个:

private void sync()
{
   //All devices in an ArrayList
    File[] roots = File.listRoots();
    ArrayList newList = new ArrayList();
    for(File f : roots)
    {
        newList.add(f);
    }

   //Delete unavailable devices
    ArrayList removeThese = new ArrayList();
    for(File f : devices)
    {
        if(!newList.contains(f))
        {
            removeThese.add(f);
        }
    }
    devices.removeAll(removeThese);

   //Add unknown devices
    for(File f : newList)
    {
        if(!devices.contains(f) && f.canRead() && f.canWrite())
        {
            alarm(f);//Called when new device inserted
            devices.add(f);
        }
    }
}

这个方法在一个单独的线程中每隔1000毫秒调用一次,我想这样做。承认,这是一个肮脏的方法,但它的工作原理。我经常测试这个功能,我总是得到我想要的结果。当我继续构建我的程序时,我发现当我将程序隐藏到SystemTray时,该线程将停止检测新设备。当我再次打开它时,检测线程仍然无法工作。谁能告诉我是什么原因造成的,以及如何解决这个问题?

4
@alfasin不幸的是,他们有时甚至会挣扎双击..
额外 作者 Rick Slinkman,
@Wolfgang感谢您的提示。当我调用hideToTray()方法时,它会保存一些信息,然后它会中断轮询线程。然后停止轮询,并且在JFrame取消隐藏时不会激活。谢谢,现在工作正常! :d
额外 作者 Rick Slinkman,
@alfasin是的,我的父母点击两次,但很慢。这意味着PC可以检测到2次单击。它们不够快,不能双击,他们害怕双击时即将发生的事情:P相机开关只需要1次推动,所以工作正常:)
额外 作者 Rick Slinkman,
看起来您在编写计算机驱动程序并将其安装到父母身上时会遇到麻烦。 :d
额外 作者 Wug,
而不是每1000毫秒调用它只需编写一个调用它的.bat文件并将其放在桌面上。我相信他们可以做 DOUBLE-CLICK ,即使他们不是那么技术;)
额外 作者 alfasin,
@RickSlinkman你是说比双击鼠标更容易将相机插入USB端口??? :)))
额外 作者 alfasin,
告诉他们点击一次然后按回车键。这也会起作用;)
额外 作者 alfasin,
看一下轮询线程启动时会发生什么。是以某种方式中断?
额外 作者 Wolfgang,

1 答案

保存用户插入的数据后,我停止检测新设备。这对我很愚蠢,所以我感谢你让我意识到这一点。

public boolean saveSettings() 
{
    File f = new File(fsv.getHomeDirectory() + File.separator + "settings.cms");
    ObjectOutputStream objOut;
    try 
    {
       //Here was my problem. 
        detector.stopDetection();

        if(gui.saveSettings())
        {
           //Settings-file wegschrijven
            objOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(f)));
            objOut.writeObject(settings);
            objOut.flush();
            objOut.close();
            return true;
        }
        else
        {
            return false;
        }
    } 
    catch (IOException e) 
    {
        handleExceptions(e);
        return false;
    }
}
2
额外