将 Arraylist 中的文本添加到 TextArea javafx
我想知道如何从存储在 ArrayList 中的对象中获取各种属性到我的 TextArea?我有一个 ListView,根据您按下 ListView 中的哪一行,TextArea 中应该出现不同的文本.我就是无法让它工作.
I wonder how to do to get various attributes from my objects stored in an ArrayList to my TextArea? I have an ListView and depending on which of the lines in the ListView you press, different text should appear in the TextArea. I just can't get it to work.
到目前为止,这是我的一些代码.动物是另一类.
Here is a bit of my code this far. Animals is another class.
ListView<String> cats = new ListView<>();
cats.setPrefSize(90, 200);
cats.getItems().addAll(
"First cat",
"Second cat"
);
final ArrayList<Animals> catsdesricption = new ArrayList<Animals>();
Animals FirstCat = new Animals("First cat", "cats", "is small and fluffy");
catsdesricption.add(FirstCat);
TextArea description = new TextArea();
description.setMaxSize(300, 200);
description.setWrapText(true);
VBox vbox = new VBox();
Label heading = new Label("Cats");
heading.setFont(new Font("Times new Roman", 20));
HBox layout = new HBox();
layout.getChildren().addAll(cats, catsdesricption);
vbox.getChildren().addAll(heading, layout);
Scene scene = new Scene(vbox, 420, 250);
primaryStage.setScene(scene);
primaryStage.show();
在仔细查看您的代码后,我发现了很多问题.回答你原来的问题.您需要 SelectionModel's
ItemProperty
上的侦听器来更新 TextArea
.
After taking a closer look at your code, I noticed a ton of problems. To answer your original question. You need a listener on the SelectionModel's
ItemProperty
to updated the TextArea
.
cats.getSelectionModel().selectedItemProperty().addListener((obs, oldAnimal, newAnimal) -> {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Name: ").append(newAnimal.getName()).append(System.lineSeparator());
stringBuilder.append("Type: ").append(newAnimal.getType()).append(System.lineSeparator());
stringBuilder.append("About: ").append(newAnimal.getAbout()).append(System.lineSeparator());
description.setText(stringBuilder.toString());
});
第一个问题:
ListView<String> cats = new ListView<>();
cats.setPrefSize(90, 200);
cats.getItems().addAll(
"First cat",
"Second cat"
);
看起来您希望 ListView
保存 Animal
对象,但您使用的是 String
对象.
It appears you want the ListView
to hold Animal
objects, but you are using String
objects.
修复
ListView<Animal> cats = new ListView<>();
cats.getItems().add(new Animal("First cat", "cats", "is small and fluffy"));
cats.getItems().add(new Animal("Second cat", "cats", "is big and fluffy"));
第二个问题:现在 ListView
正在处理 Animal
对象,我们需要使用 ListView's
CellFActory
告诉 ListView
显示什么文本.在这种情况下,将显示名称.
Second Problem:
Now that the ListView
is handling Animal
objects, we need to use the ListView's
CellFActory
to tell the ListView
what text to display. In this case, the name will be displayed.
cats.setCellFactory((ListView<Animal> param) -> {
ListCell<Animal> cell = new ListCell<Animal>() {
@Override
protected void updateItem(Animal item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item.getName());
} else {
setText("");
}
}
};
return cell;
});
既然这两件事都做完了,就可以加上原来的问题代码了.上面的代码根据在 ListView
中选择的项目来更改 TextArea 的
文本.
Now that these two things are done, the original question code can be added. The code above that changes the TextArea's
text depending on which item is selected in the ListView
.
完整代码:
主要
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
/**
* JavaFX App
*/
public class App extends Application {
@Override
public void start(Stage primaryStage) {
ListView<Animal> cats = new ListView<>();
cats.getItems().add(new Animal("First cat", "cats", "is small and fluffy"));
cats.getItems().add(new Animal("Second cat", "cats", "is big and fluffy"));
cats.setCellFactory((ListView<Animal> param) -> {
ListCell<Animal> cell = new ListCell<Animal>() {
@Override
protected void updateItem(Animal item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item.getName());
} else {
setText("");
}
}
};
return cell;
});
cats.setPrefSize(90, 200);
TextArea description = new TextArea();
description.setMaxSize(300, 200);
description.setWrapText(true);
cats.getSelectionModel().selectedItemProperty().addListener((obs, oldAnimal, newAnimal) -> {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Name: ").append(newAnimal.getName()).append(System.lineSeparator());
stringBuilder.append("Type: ").append(newAnimal.getType()).append(System.lineSeparator());
stringBuilder.append("About: ").append(newAnimal.getAbout()).append(System.lineSeparator());
description.setText(stringBuilder.toString());
});
VBox vbox = new VBox();
Label heading = new Label("Cats");
heading.setFont(new Font("Times new Roman", 20));
HBox layout = new HBox(cats, description);
vbox.getChildren().addAll(heading, layout);
Scene scene = new Scene(vbox, 420, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
}
我的动物课:(你没有发布你的)
/**
*
* @author blj0011
*/
class Animal {
private String name;
private String type;
private String about;
public Animal(String name, String type, String about) {
this.name = name;
this.type = type;
this.about = about;
}
public String getAbout() {
return about;
}
public void setAbout(String about) {
this.about = about;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Animals{name=").append(name);
sb.append(", type=").append(type);
sb.append(", about=").append(about);
sb.append('}');
return sb.toString();
}
}