java - JavaFX:如何在用户输入上动态添加文本字段和按钮
问题描述
我对Java有点陌生,我正在尝试在JavaFX中创建一个用户界面,每当用户按下“+”按钮时,它会动态地添加一个TextField和一个“编辑”按钮。我知道尝试将这些按钮和文本字段存储在列表中是个好主意,但我不确定如何将它们放在界面上
ListView<Button> dinamicButtons = new ListView<Button>();
ListView<TextField> dinamicTextFields = new ListView<TextField>();
int quantityOfDinamicFieldsAdded =0;
Button add= new Button ("+");
add.setOnAction(e -> {
dinamicButtons .add(quantityOfDinamicFieldsAdded , new Button("Edit"));
dinamicTextFields .add(quantityOfDinamicFieldsAdded , new TextField("nome do Componente"));
quantityOfDinamicFieldsAdded ++;
//remove dinamically added buttons and text fields
for (int i=0 ; i<quantityOfDinamicFieldsAdded ; i++){
//add them all back
}
});
解决方案
这是一个添加Button
和TextField
到的演示ListView
。POJO
只是跟踪TextField's
提示文本和文本Button's
。关键是使用CellFactory
.
import java.util.concurrent.atomic.AtomicInteger;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXTestingGround extends Application{
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
ListView<CellData> listView = new ListView();
listView.setCellFactory((ListView<CellData> param) -> {
ListCell<CellData> cell = new ListCell<CellData>() {
TextField textField = new TextField();
Button button = new Button();
HBox hBox = new HBox(textField, button);
{
HBox.setHgrow(textField, Priority.ALWAYS);
}
@Override
protected void updateItem(CellData item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
textField.setPromptText(item.getTextFieldPromptText());
button.setText(item.getButtonText());
button.setOnAction((actionEvent) -> {
System.out.println("You clicked " + button.getText() + ". TextField Prompt text is " + textField.getPromptText() + ".");
});
setGraphic(hBox);
} else {
setGraphic(null);
}
}
};
return cell;
});
AtomicInteger i = new AtomicInteger(1);
Button button = new Button("Add Item");
button.setOnAction((event) -> {
listView.getItems().add(new CellData("Prompt Text: " + i.get(), "Button: " + i.getAndIncrement()));
});
VBox root = new VBox(button, listView);
stage.setScene(new Scene(root));
stage.show();
}
}