当前位置: 首页 > 知识库问答 >
问题:

我想从模板在javaFX中动态创建节点

梅逸清
2023-03-14

我很难弄清楚如何在JavaFX中动态创建节点,我正在尝试为消息传递程序创建一个接口,我希望每个消息都包含在自己的节点中。我不知道将发送多少消息,因此需要根据需要创建新节点。

这就是我到目前为止所做的,我希望这样我可以添加多个MessageNode对象并显示它们

package stackkoverflow.stackoverflow;

import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class MessageControler {
    @FXML
    private Label sender;
    @FXML
    private Label message;

    private MessageNode messagenode;

    public MessageControler(MessageNode messagenode){
        this.messagenode = messagenode;
    }

    @FXML
    private void initialize(){
        sender.textProperty().bind(messagenode.senderProperty());
        message.textProperty().bind(messagenode.messageProperty());
    }

}
package stackkoverflow.stackoverflow;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class MessageNode {

    private StringProperty sender = new SimpleStringProperty();
    private StringProperty message = new SimpleStringProperty();

    public MessageNode(String sender, String message){
        this.sender.set(sender);
        this.message.set(message);
    }

    public String getSender(){
        return sender.get();
    }
    public String getMessage(){
        return message.get();
    }
    public void setSender(String sender) {
        this.sender.set(sender);
    }
    public void setMessage(String message) {
        this.message.set(message);
    }
    public StringProperty senderProperty(){
        return sender;
    }
    public StringProperty messageProperty(){
        return message;
    }



}
package stackkoverflow.stackoverflow;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class test extends Application {


    @Override
    public void start(Stage primaryStage) {
        MessageNode messageNodeTest = new MessageNode("user","hello world");
        MessageNode messageNodeTest1 = new MessageNode("user","hello world");
        MessageNode messageNodeTest2 = new MessageNode("user","hello world");
        MessageNode messageNodeTest3 = new MessageNode("user","hello world");

        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Display.fxml"));
            MessageControler controller = new MessageControler(messageNodeTest);

            loader.setController(controller);

            primaryStage.setScene(new Scene(loader.load()));
            primaryStage.show();

        }catch (IOException ie){
            ie.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }

}

共有1个答案

狄睿
2023-03-14

您可以加载FXML并在列表单元格中显示每个实例,将消息节点添加到列表视图中

首先,更改MessageController类,以便可以更改MessageNode(注意:我将重命名该类Message,因为它是数据而不是场景图节点)。这一点很重要,因为您只希望为每个单元格加载一次FXML,而不是为每个项目加载一次:

import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class MessageController {
    @FXML
    private Label sender;
    @FXML
    private Label message;

    private MessageNode messageNode ;

    public void setMessageNode(MessageNode messageNode){
        this.messageNode = messageNode ;
        sender.textProperty().unbind();
        message.textProperty().unbind();
        if (messageNode == null) {
            sender.setText("");
            message.setText("");
        } else {
            sender.textProperty().bind(messageNode.senderProperty());
            message.textProperty().bind(messageNode.messageProperty());
        }
    }

}

现在您可以执行以下操作:

// injected by FXML or just created in code, as needed:
ListView<MessageNode> listView ;

// ...

listView.setCellFactory(lv -> new ListCell<>() {

    private Node graphic ;
    private MessageController controller ;

    {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Display.fxml"));
            graphic = loader.load();
            controller = loader.getController();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }

    @Override
    protected void updateItem(MessageNode message, boolean empty) {
        super.updateItem(message, empty);
        controller.setMessageNode(message);
        if (empty || message == null) {
            setGraphic(null);
        } else {
            setGraphic(graphic);
        }
    }
});

当然了

listView.getItems().add(new MessageNode(...));

你需要什么时间都行。

 类似资料:
  • 我正在尝试构建一个在JavaFX中实现群聊的聊天应用程序。我想在边框窗格内创建一个滚动窗格,该窗格将包含用户所属的所有组。当用户加入时,需要将组图标(ImageViews)动态添加(在场景生成器中无法完成)到滚动窗格(在HBox内)。 目前,我正在使用一个SceneController类,该类负责所有阶段和场景更改。 我已经创建了一个FXML文件(使用场景生成器),其中包含一个边框窗格和一个滚动窗

  • 如何在Javafx 2.0中制作可拖动节点。JavaFX专门用于GUI目的,仅我需要一些示例,谢谢

  • 问题内容: 如何使用动态模板创建指令? 这就是我现在所拥有的,它可以正确显示标签。但是,我不确定如何在模板上附加其他HTML。或将2个模板合并为1个。 问题答案: 有类似的需求。做这份工作。(不完全确定这是否是“ THE”方法,仍然可以通过角度进行工作) http://jsbin.com/ebuhuv/7/edit-我的探索测试。 需要注意的一件事(以我的示例为例),我的要求之一是,一旦单击“保存

  • 我不知道如何在JavaFX中创建模式窗口。基本上我有文件选择器,我想在用户选择文件时问他们一个问题。我需要这些信息来解析文件,因此执行需要等待答案。 我已经看到了这个问题,但我还没有找到如何实现这个行为。

  • 问题内容: 是否有任何使用Spring或java替换模板字符串以及值的API。 例如: 其中参数(,)中的形式。 问题答案: 我最喜欢的模板引擎是Apache Velocity 也可以与Spring很好地集成,此处有介绍性文章

  • 问题内容: 让我们考虑以下情况。有一个,有一个。子窗格将添加到父窗格。考虑到可以动态地添加和删除子窗格而没有任何限制和顺序的情况下,如何才能仅在可见子窗格的情况下使parentPane可见。当然childPane的可见状态也可以随时更改。是否可以创建动态Bindings.OR,以便我可以动态向其添加/删除子可见属性?如果是,那怎么办?如果没有,那么在这种情况下使用什么解决方案? 问题答案: 您可以