所以我在这里有这个代码,它应该动态添加文本字段和按钮,具体取决于用户按下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。
答案 0 :(得分:2)
如果您希望动态添加和删除JComponents
,请考虑将其存储在ArrayList
或Vector
中。在开始时,将有一个默认的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.在按钮的监听器中,只需将子项添加到上面获得的列表中