18

ウィンドウの外観を完全にカスタマイズしたアプリケーションが欲しいです。これまでのところ、典型的なウィンドウのものを次のように削除できることを学びました。

class Application extends javafx.application.Application {
  /**
   * Starts the application.
   *
   * @param stage
   */
  override def start(stage: Stage) {
    stage.initStyle(StageStyle.TRANSPARENT)

    // Load the main window view.
    val loader = new FXMLLoader()
    loader.setLocation(getClass.getResource("/com/myproj/application/MainWindow.fxml"))

    val root = loader.load().asInstanceOf[Parent]
    val scene: Scene = new Scene(root, Color.TRANSPARENT)

    stage.setScene(scene)
    stage.show()
  }
}

ウィンドウのドラッグ、ダブルクリックによる最大化、Windows での画面上端へのドラッグがアクティブな最大化などを除いて、他のすべては正常に機能します。ネイティブのウィンドウ機能は完全に失われています。

これらの優れた機能をすべて失うことなく、ウィンドウの外観全体をどうにかして簡単にカスタマイズできますか。

私が話しているのは、Adobe Photoshop のようなもので、見た目はまったく異なりますが、これらの機能を保持しています (または、UI の上に手動で実装しています)。

初心者向けに、少なくともドラッグ + ウィンドウ ボタンを実装できれば、それが始まりです。ここでは、Linux、Mac、および Windows をターゲットにしています。

4

2 に答える 2

16

ソース コードを含むEnsemble サンプル アプリケーションで、カスタマイズされたウィンドウの外観と処理を参照してください。ソースをダウンロード、ビルドして、ブラウザーに埋め込むのではなく、スタンドアロン アプリケーションとして実行します。画面の上端にドラッグして最大化を有効にするなどの機能は機能しないため、あなたが求めているものとは正確には一致しませんが、非常に近いはずであり、ウィンドウを最大化する何かをいつでも自分でコーディングできます上端付近をドラッグしたとき。Ensemble ウィンドウには、カスタムのサイズ変更装飾、最小化、最大化、アイコンを閉じる、ウィンドウの上部にある領域を使用してウィンドウをドラッグする、またはダブルクリックしてウィンドウを最大化または最小化するなどの機能があります。デスクトップウィンドウシステムに期待されます。

求めているものにさらに近づけるために、2 つのウィンドウを作成してハックすることもできます。1 つは、画面の境界線を含む標準の装飾されたステージ ウィンドウで、もう 1 つは常にメイン ウィンドウの上に表示され、メイン ウィンドウの境界線をカスタム レンダリングでオーバーレイする、装飾されていない、または透明な子ステージです。このアプローチを実装しようとすると問題が発生する可能性があると思うので、あまりお勧めしません。

TRANSPARENT ではなく UNDECORATED ステージ スタイルを試して、ネイティブ Windows との統合が向上するかどうかを確認してください。

JavaFX がJDK8に同梱されるように現在予定されている未解決の機能リクエストがいくつかあります- Scenegraphで、実装すると、目標を達成するのに役立つ可能性があります - そのような機能が重要な場合は、それらに投票してください。

Ensemble サンプル アプリケーション

また、JavaFX 用のオープン ソース ウィンドウ フレームワークであるVFXWindowsもチェックしてください。

アップデート

また、OS ウィンドウ システムではなく JavaFX エンジンを介してレンダリングされる標準の最小化/最大化/クローズ/サイズ変更クロム コントロールを使用して、JavaFX ステージを簡単に作成できるUndecoratorプロジェクトも関連しています。これにより、Ensemble などのアプリケーションが表示するウィンドウ レンダリングに対するカスタム コントロールのようなものを実現できます。

于 2012-10-13T17:15:51.893 に答える