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
初回起動
で挙動が制限されることあり
✔ まず確認すべきチェックリスト
管理者として起動してないか
Explorerと権限が一致してるか
Java側でD&D処理を書いているか
jpackageのmanifest設定
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" />
👉 これだと完全にアウト
✔ 確認方法(簡単)
EXE起動
タスクマネージャー開く
「管理者」列を見る
👉 「はい」なら原因確定
✔ 解決方法
方法①:管理者起動をやめる(最優先)
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内容」貼ってくれれば
確定診断できます 👍