Вопрос по swing, java, macos – Java Swing - Как дважды щелкнуть файл проекта на Mac, чтобы открыть мое приложение и загрузить файл?

6

Я создал приложение Mac Java Swing и для него установил расширение файла (*. Pkkt) в & quot; Info.plist & quot; файл, поэтому при двойном щелчке по этому файлу открывается мое приложение.

Когда я делаю это, программа работает нормально. Теперь мне нужно загрузить проект (* .pkkt) в программу, но путь к файлу не передается в качестве аргумента методу main (...) в Mac, как это происходит в операционной системе Windows.

После некоторого поиска я нашел банку с яблоком для обработки & quot;MRJToolkitStubs& Quot; это имеетMRJOpenDocumentHandler интерфейс для обработки таких нажатых файлов. Я пытался использовать его для загрузки этого файла путем реализации этого интерфейса в основной класс программы, но он не работает. Реализованный метод никогда не вызывается при запуске программы.

How does this Interface run ?

------------------------------------------------- Редактировать : Добавить образец кода

Вот код, который я использую:

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;
    }
}

As mentioned in the comment above "getProjectFilePath()" is always Empty !

trashgod ... Я уже проверил этот пост. Это было действительно полезно, но я не использую OSXAdapter. Я использую MRJToolkitStubs. Brad
Возможный дубликатHow do I pass a file as argument to my Java application created using JAR Bundler? Пожалуйста, обновите ваш вопрос, если нет. trashgod
JWS можете зарегистрировать интерес к типу файла. Увидетьfile services demo. для примера. Andrew Thompson
Я не знаю, могу ли я ответить на мой вопрос, как ... Я использовал Inner class & amp; это работало нормально. Спасибо всем :) Brad
Не могли бы вы опубликовать немного вашего кода под вопросом? Moritz Petersen

Ваш Ответ

2   ответа
1

On Java 9, use 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() метод. Скажем, что человек использовал Spotlight в macOS для поиска слова «StackOverflow», а затем решил открыть документ. С помощью этого метода вы можете определить, что & quot; StackOverflow & quot; было слово, которое они искали, и решили сделать что-то с этим (возможно, выделить первое вхождение слова).

1

Расширения Apple Java.

Они должны быть включены в любой JDK, который работает на Mac OS X, но документацию довольно сложно получить. Увидетьэтот ответ Больше подробностей.

В частности, вы хотите сделать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);

Похожие вопросы