2017-09-23 99 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); 
    } 

} 
相关问题