5

我创建了一个 Mac Java Swing 应用程序,并在“Info.plist”文件中为其设置了文件扩展名 (*.pkkt),因此当双击该文件时,它会打开我的应用程序。

当我这样做时,程序运行良好。现在我需要在程序中加载 (*.pkkt) 项目,但文件路径没有像 Windows 操作系统中那样作为参数传递给 Mac 中的 main(...) 方法。

经过一番搜索,我发现了一个 Apple 处理 jar“ MRJToolkitStubs ”,它具有MRJOpenDocumentHandler接口来处理此类单击的文件。我曾尝试通过在主程序类中实现该接口来使用它来加载该文件,但它不起作用。程序启动时永远不会调用已实现的方法。

这个接口如何运行?

- - - - - - - - - - - - - - - - - - - - - - - - - 编辑: 添加代码示例

这是我正在使用的代码:

public static void main( final String[] args ) {         
    .                   
    .         
    .       
        MacOpenHandler macOpenHandler = new MacOpenHandler();        
        String projectFilePath = macOpenHandler.getProjectFilePath();  // Always Empty !!           
    }
class MacOpenHandler implements MRJOpenDocumentHandler {
    private String projectFilePath = ""; 

    public MacOpenHandler () {
        com.apple.mrj.MRJApplicationUtils.registerOpenDocumentHandler(this) ; 
    }

    @Override
    public void handleOpenFile( File projectFile ) { 
        try {
            if( projectFile != null ) {
                projectFilePath = projectFile.getCanonicalPath();
                   System.out.println( projectFilePath );  // Prints the path fine.
            }
        } catch (IOException e) {}  
    }

    public String getProjectFilePath() {
        return projectFilePath;
    }
}

正如上面的评论中提到的,“getProjectFilePath()”总是空的!

4

2 回答 2

1

在 Java 9 上,使用Desktop.setOpenFileHandler()

专有com.apple.eawt包已从 Java 的最新版本中删除,并已合并到Desktop类中的各种方法中。对于您的具体示例:

import java.awt.desktop.OpenFilesHandler;
import java.awt.desktop.OpenFilesEvent;
import java.io.File;
import java.util.List;

public class MyOpenFileHandler implements OpenFilesHandler {

    @Override
    public void openFiles​(OpenFilesEvent e) {
        for (File file: e.getFiles​()) {
            // Do whatever
        }
    }
}

然后在其他地方添加:

Desktop.getDesktop().setOpenFileHandler(new MyOpenFileHandler());

该类OpenFilesEvent也有一个getSearchTerm()方法。假设有人在 macOS 上使用 Spotlight 搜索“StackOverflow”这个词,然后决定打开一个文档。使用此方法,您能否确定“StackOverflow”是他们搜索的单词,并选择对其进行处理(可能突出显示该单词的第一次出现)。

于 2017-09-19T01:05:55.177 回答
0

您将要使用Apple Java Extensions

它们应该包含在任何在 Mac OS X 上运行的 JDK 中,但是文档很难获得。有关更多详细信息,请参阅此答案

具体来说,您需要制作一个OpenFilesHandeler.

此代码段应该可以工作:

import com.apple.eawt.event.OpenFilesHandeler;
import com.apple.eawt.event.AppEvent;
import java.io.File;
import java.util.List;

class MacOpenHandler implements OpenFilesHandeler {

    @Override
    public void openFiles(AppEvent.OpenFilesEvent e)  { 
        List<File> files = e.getFiles();
        // do something
    }

}

在某处:

import com.apple.eawt.Application;

...

MacOpenHandeler myOpenHandeler = new MacOpenHandeler();
Application.getApplication().setOpenFileHandler(myOpenHandeler);
于 2014-10-14T05:10:53.830 回答