在JavaFX中动态添加文本字段 [英] Add textfields dynamically in JavaFX

查看:579
本文介绍了在JavaFX中动态添加文本字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我在这里有这段代码,它应该根据用户按下New Column的次数动态地添加文本字段和按钮,但不会添加任何内容.

So I have this code here, and it is supposed to dynamically add textfields and buttons depending on how many times the user presses New Column however it is not adding anything.

newColumn.setOnAction(new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent e){
                String column = columns.getText();
                columns.clear();
                final HBox hbox1 = new HBox();
                final TextField textField = new TextField();
                textField.setText(column);
                Button delete = new Button("X");
                vbox.getChildren().add(hbox1);

                delete.setOnAction(new EventHandler<ActionEvent>(){
                    @Override
                    public void handle(ActionEvent e){
                        vbox.getChildren().remove(hbox1);
                    }
                });
            }
        });

这是应该添加新按钮的代码部分.这是剩下的代码,显示窗口和其他内容:

This is the part of the code that is supposed to add the new buttons. Here's the rest of the code, that displays the window and everythig else:

package GUI;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Example extends Application{

/**
 * @param args
 */
public static void main(String[] args) {
    launch(args);

}

@Override
    public void start(Stage primaryStage) {
    Scene scene = new Scene(new Group());
    primaryStage.setTitle("Parameters");
    primaryStage.setWidth(500);
    primaryStage.setHeight(800);

    showWindow(scene);

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

public void showWindow(Scene scene){
    final VBox vbox = new VBox();
    final HBox hbox = new HBox();
    final TextField columns = new TextField();
    Button newColumn = new Button("New Column");
    Button done = new Button("Done");

    hbox.setSpacing(5);
    hbox.getChildren().addAll(columns, newColumn);
    vbox.setSpacing(5);
    vbox.setPadding(new Insets(20, 0, 0, 20));
    vbox.getChildren().addAll(hbox);

    newColumn.setOnAction(new EventHandler<ActionEvent>(){
        @Override
        public void handle(ActionEvent e){
                String column = columns.getText();
                columns.clear();
                final HBox hbox1 = new HBox();
                final TextField textField = new TextField();
                textField.setText(column);
                Button delete = new Button("X");
                vbox.getChildren().add(hbox1);

                delete.setOnAction(new EventHandler<ActionEvent>(){
                    @Override
                    public void handle(ActionEvent e){
                        vbox.getChildren().remove(hbox1);
                    }
                });
            }
        });

        vbox.getChildren().addAll(done);
        ((Group) scene.getRoot()).getChildren().addAll(vbox);

}

}

如果有帮助,我也正在使用JavaFX.

I'm also using JavaFX, if that helps.

推荐答案

如果要动态地添加和删除JComponents,请考虑将它们存储在ArrayListVector中.首先,将有一个默认的JTextField,然后用户将一个接一个地添加.

If you want to be dynamic in adding and removing JComponents , consider storing them in an ArrayList or Vector. In the start, there will be a default JTextField and then then user will add one after another.

JButtonactionPerformed()中,创建一个任意大小的新JTextField.在JFrame的内容窗格上调用invalidate(),然后仅添加所需的任何组件.

In the actionPerformed() of the JButton, create a new JTextField of whatever size you want. Call invalidate() on the content pane of your JFrame and then just add whatever component you need.

好去!

SSCCE

package stack;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class DynamicButtons extends JFrame{

    JButton addMore = new JButton("AddMore");
    Container contentPane = null;

    public DynamicButtons(){

        contentPane = this.getContentPane();
        contentPane.setLayout(new FlowLayout());

        addMore.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton newButton = new JButton("ABCD");
                contentPane.invalidate();
                contentPane.add(newButton);
                pack();

            }
        });

        contentPane.add(addMore);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                new DynamicButtons();
            }
        });
    }
}  

OP需要JavaFX
1.获取您正在使用的任何Pane.
2.呼叫yourPane.getChildren()
3.在按钮的侦听器中,只需将孩子添加到上面获得的列表中

The OP needs JavaFX
1. Get your whatever Pane you are using.
2. Call the yourPane.getChildren()
3. In the listener of the button, just add the child to the list you obtained above

这篇关于在JavaFX中动态添加文本字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆