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
で定義) にアクセスできるようにするために、抽象クラス canmessage
が maincontroller
を拡張し、pctovcumessage
が # を拡張することにしました。 ##メッセージを送信できます。
in_desiredvelocity
nullpointerException が起動されます。
######質問######
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
のすべてのインスタンスに、indesiredvelocity という名前のフィールドがあることを意味します。 これを行う場合 リーリー
これは、canmessage
のすべてのインスタンスがmainviewcontroller のインスタンスでもあることを意味します。
fxml をロードすると、
fxmlloader は
mainviewcontroller
fx:controller="canbusgui.mainviewcontroller"
があるため)、そしてインスタンス で初期化された
indesiredvelocity フィールドは、fxml で宣言されたテキスト フィールドへの参照です。
リーリー
もちろん、これにより、ID
"222" を持つ新しい
pctovcumessage インスタンスが作成されます。
pctovcumessage は
canmessage から継承するため、この新しいインスタンスは canmessage
canmessage
はmainviewcontroller# から継承するため、 # # したがって、このインスタンスは mainviewcontrollerzqbendczq のインスタンス b でもあります。
mainviewcontroller の各インスタンスにはフィールド
indesiredvelocity があるため、
pctovcumessage## のこの新しいインスタンスは#indesiredvelocity
という名前のフィールドがあり、タイプは textfield
です。
ただし、フィールドを初期化することはありません (また、そのための賢明な方法がない) ため、pctovcumessage
の indesiredvelocity<code> フィールドは null になります。
そんなことをしても意味がありません。ドメイン モデルが何であるかはよくわかりません (おそらくこの質問に答える必要はありません) が、
textfield が何らかの型のオブジェクトの一部であることは意味がありません。メッセージの.
代わりに、
pctovcumessage の一部としてこのメッセージを含むデータを送信する方が合理的かもしれません。つまり。できるよ###
リーリー
そして、コントローラー内の
を に置き換えます。
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">new PcToVcuMessage("222", Integer.parseInt(inDesiredVelocity.getText()))</pre><div class="contentsignin">ログイン後にコピー</div></div>
<p>然后只需从 <code>canmessage
类中删除 extends mainviewcontroller
即可。这显然完全没有意义(消息不是控制 ui 的东西)。
一些与您的代码无关的问题:
canmessage
是一个动词(或动词短语)。可能 message
更合适,但我还是不太明白你在这里建模的内容。以上がFXML アノテーション付きプロパティを適切に継承してサブクラスで使用できるようにするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。