【发布时间】:2022-01-11 19:06:34
【问题描述】:
我无法弄清楚如何在 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);
}
}
【问题讨论】:
-
这个问题非常模糊和广泛。你能具体解释一下是什么问题吗?以minimal reproducible example 的形式包含代码,以更好地描述问题。
-
目前还不清楚问题是什么。你已经准备好了所有的部分。每次收到新消息时,像之前一样再次加载 FXML,并将生成的节点添加到 UI 的某个位置(例如,在
VBox或类似的地方)。 -
当然,您也可以将
ListView<MessageNode>与适当的单元工厂一起使用,然后将您的消息添加到其items列表中。 -
我想我想做的是你用 LIstView
描述的内容,我该怎么做? -
使用
ListCells 加载FXML,然后在关联控制器上设置MessageNode。