2013-10-24 102 views
0

所以我有这样的代码在这里,它应该动态地添加文本框和按钮取决于用户多少次按下New Column但是它没有添加任何。添加文本框的动态JavaFX中

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

这是应该添加新按钮的代码的一部分。下面的代码的其余部分,显示的窗口和其他everythig:

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

获得的列表中你[重绘(http://stackoverflow.com/questions/17305584/textfield - 不动态更新?rq = 1)文本字段? – Justin

+0

不,我想每次添加文本框的人按下按钮“新列”,或者更具体地说,我想每个人按下该按钮时添加横向方框。但是,它不会将这些框添加到我的vbox或它不显示它们。 – Argus

回答

2

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

JButtonactionPerformed()中,创建任意大小的新JTextField。在您的JFrame的内容窗格上拨打invalidate(),然后添加您需要的任何组件。

好走!

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.在按钮的听众,刚子添加到你上面

+0

我可以做到这一点,或在JavaFX的等价物,但我需要添加此ArrayList每次输入一个新的列。我不认为这会是一个问题? – Argus

+0

@Argus你应该标记它作为'JavaFX' -_-” –

+0

我忘了这一点,在任何情况下,这仍然是有用的。 – Argus