2013-10-24 145 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