Откройте файл с помощью пакета приложений Ma c (.app) на основе Java, который реализует OpenFilesHandler от Apple - PullRequest
0 голосов
/ 03 апреля 2020

Мой вопрос - это «злой близнец» из мой другой вопрос , на этот раз сосредоточенный на Java аспектах.

Мое приложение Java 8 может сохранять состояния программы в формате XML (который я назвал skktx). Чтобы приложение могло открывать файлы, передаваемые MacOS, я реализовал интерфейс Apple OpenFilesHandler.


import java.io.File;
import java.util.List;
import com.apple.eawt.AppEvent.OpenFilesEvent;
import com.apple.eawt.Application;
import com.apple.eawt.OpenFilesHandler;
import javax.swing.JOptionPane;

public class MacOpenFileHandler implements OpenFilesHandler {

    static final MacOpenFileHandler MAC_FILES_HANDLER = new MacOpenFileHandler();

    @Override
    public void openFiles(OpenFilesEvent ofe) {
        List<File> files = ofe.getFiles();
        if (files == null || files.isEmpty()) {
            return;
        }       
        JOptionPane.showMessageDialog(null, "openFiles: " + files.get(0));
        // more lines to run the actual import routines for xml
    }

    public static void setFileHandler() {
        System.out.println("setFileHandler");
        try {
            Application.getApplication().setOpenFileHandler(MAC_FILES_HANDLER);
        } catch (NoClassDefFoundError e) {
            System.err.println("error setting MacOpenFileHandler");
        }
    }
}

MacOpenFileHandler # setFileHandler вызывается при запуске (вместе с другими прослушивателями Ma c Speci c), когда приложение обнаруживает, что оно работает на MacOS. Это работает, строка "setFileHandler" печатается при запуске.

Поскольку я использую JAXB, который недоступен в Java VM> 1.8 без параметров, для запуска архива jar Java8 на Mac с более высокой версией Java я упаковал jar в комплект приложения ( .app) вместе с bash -скриптом, который вызывает JVM с необходимыми аргументами, давайте назовем это вещи. sh:

#!/bin/bash
VM_ARGS_A="--add-modules=java.xml.bind"
# Set the working directory
DIR=$(cd "$(dirname "$0")"; pwd)
APP_JAR="some-java-stuff.jar"
APP_NAME="Some Java Stuff"
APP_ICNS="stuff.icns"

#test: set command line args
STUFF_TITLE="Launching $APP_NAME"
STUFF_ARGS="$1"
ARGS_MSG="command line args: $STUFF_ARGS"
osascript \
    -e "set question to display dialog \"$ARGS_MSG\" with title \"$STUFF_TITLE\" buttons {\"Cancel\"} default button 1"
#end test

exec $_java $VM_ARGS_A -Dapple.laf.useScreenMenuBar=true -Dcom.apple.macos.use-file-dialog-packages=true -Xdock:name="$APP_NAME" -Xdock:icon="$DIR/../Resources/$APP_ICNS" -jar "$DIR/$APP_JAR"

И с этим Info.plist

    <key>CFBundleDocumentTypes</key>
        <array>
            <dict>
                <key>CFBundleTypeExtensions</key>
                <array>
                    <string>skktx</string>
                </array>
                <key>CFBundleTypeIconFile</key>
                <string>stuff.icns</string>
                <key>CFBundleTypeName</key>
                <string>Java Stuff calculation</string>
                <key>CFBundleTypeRole</key>
                <string>Viewer</string>
                <key>LSHandlerRank</key>
                <string>Owner</string>
            </dict>
        </array>
    <key>CFBundleExecutable</key>
    <string>stuff.sh</string>

Но когда я открываю файл skktx с моим stuff.app, MacOpenFileHandler # openFiles не вызывается. Диалог сообщения не отображается.

Что с ним не так?

...