从JavaFX容器中获取动态元素

时间:2018-02-16 12:13:07

标签: java javafx

我创建了一个简单的GUI,使用JavaFX和fxml。该程序的一部分是使用fxml和其他生成动态GUI。所以,我用fxml创建了javafx.scene.controller.Accordion并在其中添加了代码:

@FXML
Accordion accordionPlant;


public void init(){

    accordionPlant.getPanes().add(createTitledPanePlant(1));
    accordionPlant.getPanes().add(createTitledPanePlant(2));
}

protected TitledPane createTitledPanePlant(int index){

    TilePane tile = new TilePane(Orientation.HORIZONTAL, 5, 5);
    Label typeLabel = new Label("Тип выпуска");
    TextField typeText = new TextField();
    VBox typeContainer = new VBox(typeLabel,typeText);

    Label bankLabel = new Label("Берег");
    Tooltip.install(bankLabel, new Tooltip("Берег, с которого производится выпуск"));
    TextField bankText = new TextField();
    VBox bankContainer = new VBox(bankLabel,bankText);

    tile.getChildren().addAll(typeContainer, bankContainer);

    TitledPane titledPane = new TitledPane("Параметры выпуска " + index, tile);

    return titledPane;
}

在该用户点击按钮后,程序应找到所有TextField并计算其值。那么它必须如何正确或舒适地完成?

我试图获得手风琴的所有窗格:

void test(){
    for (TitledPane pane: accordionPlant.getPanes()) {
        pane.getChildrenUnmodifiable().get(0); //blah, blah
    }
}

但我认为这不是一个好主意,尤其是使用索引。我只需要文本字段。 implements of有什么方法吗?

1 个答案:

答案 0 :(得分:0)

如果您有动态元素,为什么不在创建它们时将它们存储在MyController.php on line 326: Account {#773 ▼ +__isInitialized__: false -id: 1 -username: null -email: null -emailIsPublic: 0 -password: null -avatar: null -biography: null -level: 1 -registerDate: null -strips: null #slug: null …2 } 中?这样你就不必尝试从容器中获取它们。您可能只对List感兴趣,但我发布了整个应用程序。如果您查看Controller,就可以看到我将createTitledPanePlant添加到TextFields - >的位置List

  

主要

List<TextField> textFieldContainer = new ArrayList();
  

控制器

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

/**
 *
 * @author blj0011
 */
public class JavaFXApplication115 extends Application
{

    @Override
    public void start(Stage stage) throws Exception
    {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}
  

FXML

import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Orientation;
import javafx.scene.control.Accordion;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;

/**
 *
 * @author blj0011
 */
public class FXMLDocumentController implements Initializable
{

    @FXML
    private Label label;
    @FXML
    private Accordion accordionMain;

    List<TextField> textFieldContainer = new ArrayList();

    @FXML
    private void handleButtonAction(ActionEvent event)
    {
        //Sum TextField
        double total = 0;

        for (TextField node : textFieldContainer) {
            double value;
            try {
                value = Double.parseDouble(node.getText());
            }
            catch (NumberFormatException e) {
                value = 0;
            }

            total += value;

        }
        label.setText("Sum: " + total);
    }

    @Override
    public void initialize(URL url, ResourceBundle rb)
    {
        // TODO
        accordionMain.getPanes().add(createTitledPanePlant(1));
        accordionMain.getPanes().add(createTitledPanePlant(2));

    }

    protected TitledPane createTitledPanePlant(int index)
    {
        TilePane tile = new TilePane(Orientation.HORIZONTAL, 5, 5);
        Label typeLabel = new Label("Тип выпуска");
        TextField typeText = new TextField();
        textFieldContainer.add(typeText);//Add your textField to the container when you create it
        VBox typeContainer = new VBox(typeLabel, typeText);

        Label bankLabel = new Label("Берег");
        Tooltip.install(bankLabel, new Tooltip("Берег, с которого производится выпуск"));
        TextField bankText = new TextField();
        textFieldContainer.add(bankText);//Add your textField to the container when you create it
        VBox bankContainer = new VBox(bankLabel, bankText);

        tile.getChildren().addAll(typeContainer, bankContainer);

        TitledPane titledPane = new TitledPane("Параметры выпуска " + index, tile);

        return titledPane;
    }
}