ホームページ  >  記事  >  FXML アノテーション付きプロパティを適切に継承してサブクラスで使用できるようにするにはどうすればよいでしょうか?

FXML アノテーション付きプロパティを適切に継承してサブクラスで使用できるようにするにはどうすればよいでしょうか?

WBOY
WBOY転載
2024-02-22 13:46:14713ブラウズ

php エディタ Xiaoxin は、Java Q&A のこの号を提供します: FXML アノテーション付きプロパティを正しく継承してサブクラスで使用できるようにする方法は? Java 開発では、FXML アノテーション付きプロパティを正しく継承することが一般的な問題であり、開発プロセス中に注意が必要な問題です。以下では、この問題をより適切に解決するために、アノテーション付きプロパティを正しく継承し、サブクラスで使用できるようにする方法について詳しく説明します。

質問内容

質問

コントローラ エリア ネットワーク上でメッセージ転送を実装しようとしています。メッセージは、javafx を使用して作成された GUI を介したユーザー入力に基づいて構築されます。

main.fxml にリンクされた maincontroller クラスがあります。 maincontroller では、fxml アノテーション in_desiredvelocity を使用してテキストフィールド属性を定義しました。これは、main.fxml の fx:id に適切にリンクされています。

次に、ネットワーク経由で送信する必要があるメッセージのバックボーンを定義する抽象クラス canmessage を定義しました。

今、クラス pctovcumessage は特定のタイプの canmessage を実装しています。 fxml プロパティ (maincontroller で定義) にアクセスできるようにするために、抽象クラス canmessagemaincontroller を拡張し、pctovcumessage が # を拡張することにしました。 ##メッセージを送信できます。

アプリケーションは正しくコンパイルされますが、GUI に入力すると、テキストフィールド

in_desiredvelocity nullpointerException が起動されます。 ######質問######

上記の fxml プロパティは

pctovcumessage (抽象クラス canmessage

を継承し、

maincontroller を拡張) によって継承されますが、これをこのプロパティに追加するにはどうすればよいですか?クラス 目標を達成するためにそれを使用しますか? ######主要###:### リーリー メインコントローラー: リーリー

canmessage.java (抽象クラス canmessage

が含まれており、

pctovcumessage がそれを拡張します): リーリー ######編集######

缶メッセージの形式は次のとおりです: id(hex)、data0、data1、data2、data3、...、data7。したがって、コントローラーで

pcutovcumessage のコンストラクターを呼び出すときは、メッセージ 222 の ID を渡します (ちなみに、これはデバイスのデータシートで指定されています) pcutovcumessage では、ユーザーが GUI のテキストフィールドに値を入力して設定した fxml プロパティ in_desiredvelocity

にアクセスする必要があります。これにより、ユーザーは次のようになります。取得 メッセージを作成するために入力された値。

編集 2

異なる ID を持つ複数のメッセージが存在する可能性があるため、コントローラーの sendmessage メソッドでポリモーフィズムを使用することを考えました。さらに、コントローラー クラスから複数の fxml プロパティへのアクセスを必要とするメッセージが存在する場合があります。

解決策

これは継承の役割ではありません。継承は、オブジェクト間の関係ではなく、クラス

間の関係です。

これを行う場合 リーリー

これは、

mainviewcontroller

のすべてのインスタンスに、

textfield

型の

indesiredvelocity という名前のフィールドがあることを意味します。 これを行う場合 リーリー

これは、

canmessage

のすべてのインスタンスが

mainviewcontroller のインスタンスでもあることを意味します。 fxml をロードすると、fxmlloadermainviewcontroller

のインスタンスを作成します (fxml に

fx:controller="canbusgui.mainviewcontroller"

があるため)、そしてインスタンス

で初期化された indesiredvelocity フィールドは、fxml で宣言されたテキスト フィールドへの参照です。

後ほどコントローラーでこれを行います

リーリー もちろん、これにより、ID "222" を持つ新しい pctovcumessage インスタンスが作成されます。 pctovcumessagecanmessage から継承するため、この新しいインスタンスは canmessage

のインスタンスでもあり、

canmessage

mainviewcontroller# から継承するため、 # # したがって、このインスタンスは mainviewcontrollerzqbendczq のインスタンス b でもあります。mainviewcontroller の各インスタンスにはフィールド indesiredvelocity があるため、pctovcumessage## のこの新しいインスタンスは#indesiredvelocity という名前のフィールドがあり、タイプは textfield です。 ただし、フィールドを初期化することはありません (また、そのための賢明な方法がない) ため、pctovcumessageindesiredvelocity<code> フィールドは null になります。 そんなことをしても意味がありません。ドメイン モデルが何であるかはよくわかりません (おそらくこの質問に答える必要はありません) が、textfield が何らかの型のオブジェクトの一部であることは意味がありません。メッセージの. 代わりに、pctovcumessage の一部としてこのメ​​ッセージを含むデータを送信する方が合理的かもしれません。つまり。できるよ### リーリー そして、コントローラー内の

new pctovcumessage("222")

に置き換えます。 <pre class="brush:php;toolbar:false;">new PcToVcuMessage(&quot;222&quot;, Integer.parseInt(inDesiredVelocity.getText()))</pre> <p>然后只需从 <code>canmessage 类中删除 extends mainviewcontroller 即可。这显然完全没有意义(消息不是控制 ui 的东西)。

一些与您的代码无关的问题:

  1. 不要使用文本字段注册按键处理程序。要处理用户按 enter 的操作,请以通常的方式使用操作处理程序。
  2. 适当地命名类和变量。类名称应该是名词(它们代表事物)。 canmessage 是一个动词(或动词短语)。可能 message 更合适,但我还是不太明白你在这里建模的内容。

以上がFXML アノテーション付きプロパティを適切に継承してサブクラスで使用できるようにするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。