2015-01-26 57 views
0

我遇到了一個我正在處理的Java項目的問題:我正在通過面板上的javafx中的代碼創建一個按鈕網格。這些按鈕是我編寫的javafx Button類的所有類型的子類。JavaFX設置鼠標上的按鈕樣式點擊

下面是類的頭:

private final String BASIC_STYLE = "-fx-font: 6 arial;"; 
private final String CLICKED_STYLE = "-fx-background-color: #0f0"; 

private int row; 
private int col; 
private String category; 
private boolean selected = false; 

在構造函數中我做的follwing:

this.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      toggleSelected(); 
     } 
    }); 

這裏的toggleSelected()方法:

public void toggleSelected() { 
    this.selected = !selected; 
    this.setStyle(selected ? this.BASIC_STYLE : this.BASIC_STYLE+this.CLICKED_STYLE); 
} 

它基本上咋辦每次點擊按鈕時切換樣式。當我點擊按鈕時,按鈕首先被操作系統選定(邊框變爲藍色),並且只有當我第二次點擊完全相同的按鈕後,它纔會變成綠色(我通過setStyle提供的樣式)。 但是,所選屬性在第一次單擊時變爲true,在第二次單擊時爲false,這意味着我單擊按鈕一次,它將獲得一個藍色邊框並選擇= true,如果第二次單擊它,它將變爲綠色並且selected = false,如果我第三次點擊它,它會再次變得正常,但選中的將再次爲真。 我覺得很奇怪,第一次點擊按鈕會正確更改「selected」變量,但不會改變樣式。爲什麼會發生這種情況,我如何避免在點擊之前先選擇按鈕?

+0

什麼樣式初始化爲? – 2015-01-26 18:22:46

+0

在構造函數中:\t \t this.setStyle(this.BASIC_STYLE); – 2015-01-26 18:40:45

回答

0

您初始化

selected = false ; 

setStyle(BASIC_STYLE); 

但事件處理程序強制執行規則

selected == true -> setStyle(BASIC_STYLE); 
selected == false -> setStyle(CLICKED_STYLE); 

所以你的初始狀態是不符合你的處理程序強制執行狀態。

從初始狀態,第一次單擊時,selected設置爲true,這導致setStyle(BASIC_STYLE)(這是它已有的值,因此沒有任何更改)。從那時起,所有東西都會根據需要切換。

您可能需要更改初始狀態,或者在處理程序中切換setStyle(...)調用的邏輯。

+0

哦,我的...我很愚蠢,非常感謝。 – 2015-01-26 19:00:02

0
public class ButtonEnterAction extends Button { 

    boolean selected = true; 

    public ButtonEnterAction(String connect) { 
     setText(connect); 
     action(); 
    } 

    public ButtonEnterAction() { 
     action(); 
    } 

    private void action() { 
     EventHandler<KeyEvent> enterEvent = (KeyEvent event) -> { 
      if (event.getCode() == KeyCode.ENTER) { 
       fire(); 
      } 
     }; 
     addEventFilter(KeyEvent.KEY_PRESSED, enterEvent); 

//  setOnMouseEntered(new EventHandler<MouseEvent>() { 
//   @Override 
//   public void handle(MouseEvent me) { 
//    SepiaTone st = new SepiaTone(); 
//    setEffect(st); 
//   } 
//  }); 
//  setOnMouseExited(new EventHandler<MouseEvent>() { 
//   @Override 
//   public void handle(MouseEvent me) { 
//    setEffect(null); 
//   } 
//  }); 
    } 

    @Override 
    public void fire() { 
     super.fire(); //To change body of generated methods, choose Tools | Templates. 
     if (selected) { 
      SepiaTone st = new SepiaTone(); 
      setEffect(st); 
     } else { 
      setEffect(null); 
     } 
     selected = !selected; 
    } 

} 

在ButtonEnterAction中創建Instant類就像。

ButtonEnterAction bea = new ButtonEnterAction("TestButton"); 

     bea.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("hello"); 
      } 
     });