首页 > 解决方案 > 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
            }
        });

标签: javauser-interfacejavafx

解决方案


这是一个添加ButtonTextField到的演示ListViewPOJO只是跟踪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();
    }    
}

在此处输入图像描述


推荐阅读