2017-09-23 157 views
1

我想通過點擊存在的原始按鈕創建一個新的按鈕,如下面的代碼所示。現在我希望新按鈕具有與當前按鈕相同的功能。當我點擊新按鈕時,它也會創建新的按鈕。如果原始按鈕具有更多功能,並且新按鈕也可以具有這些功能。javafx複製當前節點到另一個節點的功能

Button btn = new Button("Original Button"); 

    VBox root = new VBox(); 
    root.getChildren().add(btn); 

    btn.setOnMouseClicked(e->{ 
     root.getChildren().add(new Button("New button")); 
    }); 
+2

有通過複製每一個事件處理程序,例如,沒有辦法解決這樣做'button oldButton =(Button)e.getSource(); Button newButton = new Button(...); newButton.setOnMouseClicked(oldButton.getOnMouseClicked());'。然而,使用'addEventHandler'添加的事件處理程序不能被枚舉(至少不能通過反射訪問私有成員)。順便說一句:請注意,通常'onAction'事件用於按鈕而不是'onMouseClicked',因爲前一個事件也是在按下按鈕時觸發的。 – fabian

回答

1

從@fabian建議代碼:

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

/** 
* 
* @author Sedrick 
*/ 
public class JavaFXApplication11 extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     VBox vbox = new VBox(); 

     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       Button oldButton = (Button)event.getSource();     
       Button newButton = new Button("new Button"); 
       vbox.getChildren().add(newButton); 
       newButton.setOnAction(oldButton.getOnAction());    
      } 
     }); 


     vbox.getChildren().add(btn); 

     StackPane root = new StackPane(); 
     root.getChildren().add(vbox); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

} 
相關問題