KDP(電子出版)のメモ 急急如律令

Amazon Kindleダイレクト・パブリッシングでの電子出版や電子書籍の作成販売について、文章やイラストの作成や編集方法について書いています。

jpackageでつくったwindowsアプリでドラッグ・アンド・ドロップが機能しない

AozoraEpub3のexe版でドラッグ・アンド・ドロップができない理由を探していくと。

You:

jpackageでつくったwindowsアプリでドラッグ・アンド・ドロップが機能しない理由は

ChatGPT:

jpackage で作った Windows アプリでドラッグ&ドロップ(D&D)が効かない原因は、いくつか典型パターンがあります。結論から言うと「Windowsの権限・実行方式・UIフレームワークの制約」が主な原因です。


① 管理者権限(UAC)の不一致

最も多い原因です。

  • アプリが「管理者として実行」されている

  • Explorer(ドラッグ元)は通常権限

👉 この状態だと Windowsの仕様でD&Dはブロックされます

対策

  • アプリを管理者で起動しない

  • または両方を同じ権限で動かす


jpackage の manifest 設定

jpackage で生成された exe によっては、内部 manifest が影響します。

例えば:

  • requireAdministrator → D&D不可

  • asInvoker → OK

対策

Bash

jpackage \--win-console \--win-shortcut ...

または独自 manifest を指定:

Bash

\--resource-dir

③ Java 側の実装不足(Swing / JavaFX)

Swing の場合

D&Dは自動では有効になりません

Java

new DropTarget(component, new DropTargetListener() { ... });

または

Java

component.setTransferHandler(new TransferHandler() { ... });

JavaFX の場合

イベントをちゃんと処理しないと動きません

Java

node.setOnDragOver(e -> {  
    if (e.getGestureSource() != node && e.getDragboard().hasFiles()) {  
        e.acceptTransferModes(TransferMode.COPY);  
    }  
    e.consume();  
});  
  
node.setOnDragDropped(e -> {  
    Dragboard db \= e.getDragboard();  
    if (db.hasFiles()) {  
        // ファイル処理  
    }  
    e.setDropCompleted(true);  
    e.consume();  
});

④ ネイティブパッケージ化による挙動差

jpackage で exe 化すると:

  • working directory が変わる

  • classpath 解決が変わる

  • セキュリティ制限が変わる

👉 結果として
「ファイル取得できてない」=D&D失敗に見える


⑤ ファイルパスの扱いミス

Windowsでは:

  • 日本語パス

  • 長いパス

  • UNCパス

などで失敗するケースあり


⑥ AWT の制限(古いJDK)

古いJDKだと:

  • 高DPI

  • Windows11

でD&Dが壊れることあり

👉 JDK 17+ 推奨


⑦ セキュリティソフト / SmartScreen

まれに:

  • 未署名exe

  • 初回起動

で挙動が制限されることあり


✔ まず確認すべきチェックリスト

  1. 管理者として起動してないか

  2. Explorerと権限が一致してるか

  3. Java側でD&D処理を書いているか

  4. jpackageのmanifest設定

  5. JDKのバージョン(17以上)


✔ 一番ありがちな原因

👉 「管理者権限で起動している」

これは本当に多いです。


もしコード(Swing / JavaFX)や jpackage のオプションを貼ってくれれば、ピンポイントで原因特定できます。

You:

Swingのjarではドラッグ・アンド・ドロップ可能な場合は

ChatGPT:

それなら原因はかなり絞れます。
「SwingのJARでは動くのに、jpackageのEXEでは動かない」場合はほぼこれです👇


✔ 結論

👉 管理者権限(UAC)の不一致が原因の可能性が非常に高い


🔥 なぜ起きるか

  • java -jar で起動
    → 通常権限(Explorerと同じ)
    → ✅ ドラッグ&ドロップできる

  • jpackage の exe
    → 場合によっては「管理者として実行」扱い
    → ❌ Explorer(通常権限)からD&Dできない

Windowsの仕様で:

権限レベルが違うプロセス間ではドラッグ&ドロップは禁止


✔ よくあるパターン

① ショートカットや設定で昇格している

  • exeのプロパティ → 「管理者として実行」にチェック

  • 互換性設定で昇格


② manifest が管理者要求になっている

jpackage の内部設定でこうなってる場合:

XML

<requestedExecutionLevel level\="requireAdministrator" />

👉 これだと完全にアウト


✔ 確認方法(簡単)

  1. EXE起動

  2. タスクマネージャー開く

  3. 「管理者」列を見る

👉 「はい」なら原因確定


✔ 解決方法

方法①:管理者起動をやめる(最優先)

  • exeのプロパティ → 管理者実行をOFF

  • ショートカットも確認


方法②:manifest を修正

asInvoker にする

XML

<requestedExecutionLevel level\="asInvoker" uiAccess\="false"/>

jpackage で指定:

Bash

jpackage ^  
  \--type exe ^  
  \--input target ^  
  \--main-jar app.jar ^  
  \--name MyApp ^  
  \--resource-dir resources

👉 resources に manifest を置く


方法③:どうしても管理者が必要な場合

これは回避不可です:

  • Explorerも管理者で起動する(非推奨)

  • または D&D を諦める


✔ 他の可能性(低いが一応)

・working directory 問題

→ D&D自体は成功してるがファイル処理で落ちてる

・JDK差異

jpackage は別JREを使うので微妙に挙動差


✔ まとめ

Swing JARで動くなら:

👉 コードは正しい

つまり原因は100%環境側で:

👉 ほぼUAC(管理者権限)問題


必要なら
「jpackageコマンド」 or 「exeのmanifest内容」貼ってくれれば
確定診断できます 👍