3

多くの場合、既存のクラスを拡張するクラスで JavaFX をカスタマイズする必要があります。たとえば、軸のラベルを回転できるようにするメソッドを NumberAxis クラスに追加するために、このアプローチを試しました。しかし、「NumberAxis は final として宣言されているため、拡張できません」というコンパイラ エラーが発生しました。クラスを延長する人はどうするのだろうか?彼らは javafx のソース コードにアクセスし、いくつかのクラスを最終的なものにしないように変更し、再コンパイルしますか? (トリッキーに聞こえます!)

4

1 に答える 1

5

JavaFX フレームワークで多くのクラスを final にすることは、フレームワーク開発者による意図的な決定でした。なぜそれが行われたのかを理解するには、Making Color Final の提案を参照してください。これは一例であり、他にも理由があります。Swing フレームワークでのサブクラス化の経験から、JavaFX 設計者が回避したかったエラーやメンテナンスの問題が発生したため、多くのことが最終的なものになったと思います。

直接サブクラス化する以外にも、機能を拡張する方法があります。ローテーションの例のいくつかの代替案:

  1. 集約: NumberAxis を新しいクラス (NumberAxisWithRotatableText など) のメンバーとして含めます。これにより、基になる NumberAxis ノードを取得するためのアクセサーと、回転を実行するメソッドが追加されます (たとえば、以下で説明するルックアップを介して)。
  2. 構成:たとえば、Pane を拡張し、NumberAxis を追加し、軸上の標準テキスト描画を無効にし、必要に応じて回転ラベルを自分で追加します。
  3. css スタイルシート:たとえば、セレクターを使用して NumberAxis 内のテキストをルックアップし、-fx-rotate 属性を使用してテキストを回転させます。
  4. ノード ルックアップ: node.lookupを使用して基になるテキスト ノードを取得し、API を介して回転を適用します。
  5. skin:すべてのコントロールにはスキンクラスがアタッチされており、デフォルトのスキン クラスをカスタム スキン クラスに置き換えます。
  6. 代替クラスのサブクラス化:最終的な NumberAxis クラスではなく、抽象ValueAxisクラスをサブクラス化します。

JavaFX のソース コードは、ビルド手順と共に入手できます。ただし、ソースコードの個人用コピーをハッキングして最終構造を削除することはお勧めしません。ただし、標準の JavaFX インストールでアプリが壊れないようにするために、承認済みパッチとして JavaFX システムに送信する場合を除きます。 .

特定のクラスをサブクラス化することが本当に良い考えであると考える場合は、変更要求をログに記録してください。時々、JavaFX 開発者は熱心すぎて、最終版ではないほうがよいものを最終版にします。NumberAxis はおそらくそのカテゴリに分類されます。

于 2013-07-25T21:07:40.147 に答える