Editor PHP Xiaoxin membawakan kepada anda isu Java Soal Jawab: Bagaimana untuk mewarisi sifat beranotasi FXML dengan betul untuk menjadikannya tersedia dalam subkelas? Dalam pembangunan Java, mewarisi sifat beranotasi FXML dengan betul adalah masalah biasa dan sesuatu yang memerlukan perhatian semasa proses pembangunan. Di bawah ini kami akan membincangkan secara terperinci cara mewarisi sifat beranotasi dengan betul dan menjadikannya tersedia dalam subkelas untuk membantu anda menyelesaikan masalah ini dengan lebih baik.
Soalan
Saya cuba melaksanakan pemindahan mesej melalui rangkaian kawasan pengawal, di mana mesej dibina berdasarkan input pengguna melalui gui yang dibuat menggunakan javafx.
Saya ada pautan ke main.fxml maincontroller
类。在 maincontroller
中,我定义了一个带 fxml 注释的 textfield 属性 in_desiredvelocity
,该属性正确链接到 main.fxml 中的 fx:id
.
Saya kemudiannya menentukan kelas abstrak canmessage
yang mentakrifkan tulang belakang mesej yang mesti dihantar melalui rangkaian.
Now class pctovcumessage
实现了特定类型的 canmessage。为了能够访问 fxml 属性(在 maincontroller
中定义),我决定抽象类 canmessage
扩展 maincontroller
,而 pctovcumessage
扩展 canmessage
melaksanakan jenis canmessage tertentu. Untuk dapat mengakses sifat fxml (ditakrifkan dalam maincontroller
), saya memutuskan bahawa kelas abstrak
maincontroller
dan memanjangkan in_desiredvelocity
nullpointerexception
.
Aplikasi disusun dengan betul, tetapi apabila saya menaip dalam gui, medan teks dilancarkan .
Soalanpctovcumessage
继承的(它继承自抽象类 canmessage
并且扩展了 maincontroller
Walaupun sifat fxml di atas diwarisi oleh (ia mewarisi daripada kelas abstrak dan memanjangkan
Utama:
package canbusgui; import javafx.application.application; import javafx.fxml.fxmlloader; import javafx.scene.scene; import javafx.stage.stage; import java.io.ioexception; public class mainapplication extends application { public static stage stage = null; @override public void start(stage stage) throws ioexception { stage.setoncloserequest(event -> { system.exit(0); }); mainapplication.stage = stage; // create a fxmlloader to load the fxml file that defines the user interface fxmlloader fxmlloader = new fxmlloader(mainapplication.class.getresource("mainview.fxml")); scene scene = new scene(fxmlloader.load()); stage.settitle("canbus gui"); stage.setscene(scene); stage.setresizable(false); stage.setminheight(768); stage.setminwidth(1366); stage.show(); } public static void main(string[] args) { launch(); } }
Induk Pengawal:canmessage
和 pctovcumessage
package canbusgui; import javafx.application.platform; import javafx.collections.fxcollections; import javafx.fxml.fxml; import javafx.scene.input.keycode; import javafx.scene.input.keyevent; public class mainviewcontroller { @fxml protected textfield in_desiredvelocity; @fxml public void initialize (){ in_desiredvelocity.addeventfilter(keyevent.key_pressed, event -> { if (event.getcode() == keycode.enter) { try { sendmessage(new pctovcumessage("222")); } catch (exception e) { throw new runtimeexception(e); } } }); } public void sendmessage(canmessage message) throws exception { message.constructdata(); message.validateinputs(); byte[] data = message.getdata(); // send the data array to the can bus canbuscontroller.sendcommand(hexformat.fromhexdigits(message.getid()), data); } }
canmessage.java (ia mengandungi kelas abstrak dan
memanjangkannya):
package canbusgui; import static java.lang.Integer.parseInt; public abstract class canMessage extends MainViewController{ // Declare common attributes protected String id; protected byte[] data; public canMessage(String id) { this.id = id; // Initialize an empty byte array for data this.data = new byte[8]; } // Define an abstract method to construct the data array public abstract void constructData(); // Define an abstract method to validate the inputs public abstract void validateInputs() throws Exception; // Define a getter method for the data array public byte[] getData() { return this.data; } public String getId() { return this.id; } } // Define a subclass for PC_to_VCUMessage message class PcToVcuMessage extends canMessage { public PcToVcuMessage(String id) { // Call the superclass constructor super(id); } // Override the constructData method @Override public void constructData() { data[0] = (byte) 0; data[1] = (byte) 0; data[2] = (byte) 0; data[3] = (byte) parseInt(in_desiredVelocity.getText()); //HERE in_desiredVelocity is null and a NillPointerException is launched data[4] = (byte) 0; data[5] = (byte) 0; data[6] = (byte) 0; data[7] = (byte) 0; } public void validateInputs() throws Exception{} }
pcutovcumessage
Editpcutovcumessage
中,我需要访问 fxml 属性 in_desiredvelocity
dalam pengawal saya menghantar id mesej 222 (yang btw dinyatakan dalam lembaran data peranti) Dalam
Saya perlu mengakses harta fxmlin_desiredvelocity
yang telah ditetapkan oleh pengguna dengan menaip nilai dalam medan teks gui: dengan cara ini nilai yang ditaip oleh pengguna boleh diambil untuk membina mesej.
Memandangkan terdapat berbilang mesej dengan id yang berbeza, saya terfikir untuk menggunakan polimorfisme dalam kaedah hantar mesej dalam pengawal. Selain itu, mungkin terdapat mesej yang memerlukan akses kepada berbilang sifat fxml daripada kelas pengawal. Penyelesaian
Ini sama sekali bukan harta pusaka. Warisan ialah hubungan antarakelas
, bukan antaraobjekmainviewcontroller
的每个实例都会有一个名为 indesiredvelocity
的字段,其类型为 textfield
.
Apabila anda melakukan ini
public class mainviewcontroller { // ... protected textfield indesiredvelocity; // ... }
Ini bermakna canmessage
的每个实例也是 mainviewcontroller
.
Apabila anda melakukan inifxmlloader
会创建 mainviewcontroller
的实例(因为 fxml 中有 fx:controller="canbusgui.mainviewcontroller"
),并在该实例中初始化 indesiredvelocity
public abstract class canmessage extends mainviewcontroller { // ... }Ini bermakna setiap kejadian juga merupakan contoh
mainviewcontroller
.
Apabila memuatkan fxml, medan
pctovcumessage
实例,其 id 为 "222"
。由于 pctovcumessage
继承自 canmessage
,因此该新实例也是 canmessage
的实例,并且由于 canmessage
继承自 mainviewcontroller
,因此该实例也是 mainviewcontrollerzqbendczq 的实例b,由于 <code>mainviewcontroller
的每个实例都有一个字段 indesiredvelocity
,因此 pctovcumessage
的这个新实例有一个名为 indesiredvelocity
的字段,类型为 textfield
Rujukan kepada medan teks yang diisytiharkan dalam fxml.
Nanti dalam pengawal anda, anda akan melakukan inipctovcumessage
中的 indesiredvelocity
new pctovcumessage("222")Sudah tentu, ini mencipta contoh
baharu dengan id "222"
. Memandangkan textfield
mewarisi daripada
, dan kerana pctovcumessage
mewarisi daripada mainviewcontroller
, tika ini juga merupakan contoh mainviewcontrollerzqbendczq, kerana <code>mainviewcontroller
Setiap kejadian mempunyai medan indesiredvelocity
, jadi tika baharu
indesiredvelocity
jenis . new pctovcumessage("222")
class pctovcumessage extends canmessage { private int desiredvelocity ; public pctovcumessage(string id, int desiredvelocity) { // call the superclass constructor super(id); this.desiredvelocity = desiredvelocity; } // override the constructdata method @override public void constructdata() { data[0] = (byte) 0; data[1] = (byte) 0; data[2] = (byte) 0; data[3] = (byte) desiredvelocity; data[4] = (byte) 0; data[5] = (byte) 0; data[6] = (byte) 0; data[7] = (byte) 0; } public void validateinputs() throws exception{} }🎜 dan gantikan 🎜 dengan 🎜 dalam pengawal
new PcToVcuMessage("222", Integer.parseInt(inDesiredVelocity.getText()))
然后只需从 canmessage
类中删除 extends mainviewcontroller
即可。这显然完全没有意义(消息不是控制 ui 的东西)。
一些与您的代码无关的问题:
canmessage
是一个动词(或动词短语)。可能 message
更合适,但我还是不太明白你在这里建模的内容。Atas ialah kandungan terperinci Bagaimana untuk mewarisi sifat beranotasi FXML dengan betul untuk menjadikannya tersedia dalam subkelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!