2014-09-28 106 views
0

我今天正在做一些功課,並完成了作業的所有目標,我相信這會讓我滿意。然而,在較早的類中,我們使用相同的事件處理程序進行多個操作(在本例中,您要麼在文本字段中鍵入顏色,要麼單擊按鈕以更改框的背景顏色) 。使用一個事件處理程序進行多個操作

我無法弄清楚在這種情況下我該怎麼做......我必須在構造函數中選擇一個類型嗎?如果第一個參數可能是按鈕或文本框,那麼我認爲這會有所幫助。

我只是想弄清楚如何應用DRY(不要重複自己),只要我可以。

public class ColorChooserApplication extends Application 
{ 

@Override 
public void start(Stage stage) 
{ 
    // Create all UI components 
    VBox backgroundBox = new VBox(10); 
    backgroundBox.setPadding(new Insets(10)); 
    HBox topBox = new HBox(10); 
    HBox bottomBox = new HBox(10); 

    TextField colorPrompt = new TextField(); 
    colorPrompt.setOnAction(new ColorHandler(colorPrompt, backgroundBox)); 

    Button redButton = new Button("Red"); 
    redButton.setOnAction(new ButtonHandler(redButton, backgroundBox)); 

    Button whiteButton = new Button("White"); 
    whiteButton.setOnAction(new ButtonHandler(whiteButton, backgroundBox)); 

    Button blueButton = new Button("Blue"); 
    blueButton.setOnAction(new ButtonHandler(blueButton, backgroundBox)); 



    // Assemble 
    topBox.getChildren().add(colorPrompt); 
    bottomBox.getChildren().addAll(redButton, whiteButton, blueButton); 

    backgroundBox.getChildren().addAll(topBox, bottomBox); 
    backgroundBox.setAlignment(Pos.CENTER); 
    topBox.setAlignment(Pos.CENTER); 
    bottomBox.setAlignment(Pos.CENTER); 

    // Set scene and show 
    stage.setScene(new Scene(backgroundBox)); 
    stage.show(); 

} 

class ColorHandler implements EventHandler<ActionEvent> 
{ 

    TextField colorTf; 
    VBox bgVbox; 

    public ColorHandler(TextField colorTf, VBox bgVbox) 
    { 
     this.colorTf = colorTf; 
     this.bgVbox = bgVbox; 
    } 

    @Override 
    public void handle(ActionEvent event) 
    { 
     String color = colorTf.getText(); 
     bgVbox.setStyle("-fx-background-color:" + color); 
    } 

} 

class ButtonHandler implements EventHandler<ActionEvent> 
{ 

    Button colorButton; 
    VBox bgVbox; 

    public ButtonHandler(Button colorButton, VBox bgVbox) 
    { 
     this.colorButton = colorButton; 
     this.bgVbox = bgVbox; 
    } 

    @Override 
    public void handle(ActionEvent event) 
    { 
     String color = colorButton.getText(); 
     bgVbox.setStyle("-fx-background-color:" + color); 
    } 

} 

public static void main(String[] args) 
{ 
    launch(args); 
} 

}

回答

1

如果您使用的是Java 8,你可以做

class ColorHandler implements EventHandler<ActionEvent> { 
    Supplier<String> colorSupplier ; 
    VBox bgVbox ; 

    public ColorHandler(Supplier<String> colorSupplier, VBox bgVbox) { 
     this.colorSupplier = colorSupplier ; 
     this.bgVbox = bgVbox ; 
    } 

    @Override 
    public void handle(ActionEvent event) { 
     String color = colorSupplier.get(); 
     bgVbox.setStyle("-fx-background-color: "+color); 
    } 
} 

然後

colorPrompt.setOnAction(new ColorHandler(colorPrompt::getText, backgroundBox)); 
redButton.setOnAction(new ColorHandler(redButton::getText, backgroundBox)); 

請注意,你需要提供的第一個參數是一些函數,返回在CSS中使用正確的字符串。所以,你可以做這樣的事情

whiteButton.setOnAction(new ColorHandler(() -> "#ffffff", backgroundBox)); 
blueButton.setOnAction(new ColorHandler(() -> "cornflowerblue", backgroundBox)); 

相關問題