Rumah >Java >Bagaimana untuk mewarisi sifat beranotasi FXML dengan betul untuk menjadikannya tersedia dalam subkelas?

Bagaimana untuk mewarisi sifat beranotasi FXML dengan betul untuk menjadikannya tersedia dalam subkelas?

WBOY
WBOYke hadapan
2024-02-22 13:46:14758semak imbas

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.

Isi soalan

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

memanjangkan 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 pengawal utama), bagaimana saya boleh menggunakannya dalam kelas ini untuk mencapai matlamat saya?

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:canmessagepctovcumessage

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

Edit

pcutovcumessage 中,我需要访问 fxml 属性 in_desiredvelocity

Format mesej tin adalah seperti berikut: id(hex), data0, data1, data2, data3, ..., data7. Jadi apabila saya memanggil pembina

dalam pengawal saya menghantar id mesej 222 (yang btw dinyatakan dalam lembaran data peranti) Dalam

Saya perlu mengakses harta fxml in_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.

Edit 2

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 antara

kelas

, bukan antara

objekmainviewcontroller 的每个实例都会有一个名为 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 的字段,类型为 textfieldRujukan kepada medan teks yang diisytiharkan dalam fxml.

Nanti dalam pengawal anda, anda akan melakukan inipctovcumessage 中的 indesiredvelocity

new pctovcumessage(&quot;222&quot;)

Sudah tentu, ini mencipta contoh

baharu dengan id "222". Memandangkan textfield mewarisi daripada

, tika baharu ini juga merupakan tika

, dan kerana pctovcumessage mewarisi daripada mainviewcontroller, tika ini juga merupakan contoh mainviewcontrollerzqbendczq, kerana <code>mainviewcontroller Setiap kejadian mempunyai medan indesiredvelocity, jadi tika baharu

ini mempunyai medan bernama indesiredvelocity jenis

. new pctovcumessage(&quot;222&quot;)

Walau bagaimanapun, anda tidak pernah memulakan medan (dan tiada cara yang munasabah untuk berbuat demikian), jadi medan 🎜 adalah batal. 🎜 🎜Tiada gunanya melakukan ini. Saya tidak begitu memahami model domain anda (saya mungkin tidak perlu menjawab soalan), tetapi tidak masuk akal untuk 🎜 menjadi sebahagian daripada objek jenis mesej.🎜 🎜Sebaliknya, mungkin masuk akal untuk menghantar data yang dihantar dengan mesej ini sebagai sebahagian daripada 🎜. iaitu. Anda boleh melakukannya 🎜
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 的东西)。

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

  1. 不要使用文本字段注册按键处理程序。要处理用户按 enter 的操作,请以通常的方式使用操作处理程序。
  2. 适当地命名类和变量。类名称应该是名词(它们代表事物)。 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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam