在JavaFX中动态添加文本字段

时间:2013-10-24 00:42:22

标签: java javafx-2

所以我在这里有这个代码,它应该动态添加文本字段和按钮,具体取决于用户按下New Column的次数,但它没有添加任何内容。

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);
                    }
                });
            }
        });

这是应该添加新按钮的代码的一部分。这是代码的其余部分,它显示窗口和其他所有内容:

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。

1 个答案:

答案 0 :(得分:2)

如果您希望动态添加和删除JComponents,请考虑将其存储在ArrayListVector中。在开始时,将有一个默认的JTextField,然后用户将一个接一个地添加。

actionPerformed()的{​​{1}}中,创建您想要的任何大小的新JButton。在JTextField的内容窗格中调用invalidate(),然后只需添加您需要的任何组件。

很高兴去!

SSCCE

JFrame

OP需要JavaFX
1.获取您正在使用的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(); } }); } }
Pane
3.在按钮的监听器中,只需将子项添加到上面获得的列表中