2012-12-05 35 views
10

Ứng dụng JavaML FXML của tôi có vấn đề.Sự kiện JAVAFX được kích hoạt khi chọn hộp kiểm

Khi tôi chọn hộp kiểm trên biểu mẫu, tôi muốn thực hiện một phương pháp dựa trên hộp kiểm đã được nhấp. Có cách nào để tôi có thể chuyển tên của hộp kiểm đến phương thức để tôi có thể thực hiện một số công việc có điều kiện không?

Tôi có hai hộp kiểm và chỉ một hộp kiểm có thể được chọn. Khi tôi bấm vào một, khác nên được bỏ chọn và ngược lại. Rõ ràng là mã dưới đây sẽ không hoạt động vì vậy tôi đang tìm cách chuyển tên của đối tượng đã được nhấp vào.

Bất kỳ trợ giúp nào sẽ được đánh giá cao, cảm ơn rất nhiều.

@FXML private void updateRcs(){ 

    if (chkRcsuri.isSelected()){ 
     chkRcsuri2.setSelected(false); 
    } 

    if (chkRcsuri2.isSelected()){ 
     chkRcsuri.setSelected(false); 
    } 

} 

Trả lời

22

Bạn có thể sử dụng theo dõi thay đổi hoặc sử dụng cơ chế Xử lý sự kiện của JavaFX.
Với hộp kiểm như thế này,

final CheckBox chk1 = new CheckBox("chk 1"); 
final CheckBox chk2 = new CheckBox("chk 2"); 

Thay đổi theo dõi

chk1.selectedProperty().addListener(new ChangeListener<Boolean>() { 
    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
     chk2.setSelected(!newValue); 
    } 
}); 

chk2.selectedProperty().addListener(new ChangeListener<Boolean>() { 
    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
     chk1.setSelected(!newValue); 
    } 
}); 

Sử dụng xử lý

EventHandler eh = new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent event) { 
     if (event.getSource() instanceof CheckBox) { 
      CheckBox chk = (CheckBox) event.getSource(); 
      System.out.println("Action performed on checkbox " + chk.getText()); 
      if ("chk 1".equals(chk.getText())) { 
       chk2.setSelected(!chk1.isSelected()); 
      } else if ("chk 2".equals(chk.getText())) { 
       chk1.setSelected(!chk2.isSelected()); 
      } 
     } 
    } 
}; 

chk1.setOnAction(eh); 
chk2.setOnAction(eh); 
7

Sẽ không nút radio cung cấp cho bạn một lựa chọn loại trừ lẫn nhau sự kiện? Chỉ cần đảm bảo bạn đặt tên nhóm là giống nhau - chọn một tên sẽ tự động bỏ chọn tên kia và bạn chỉ có thể đặt thêm logic trong sự kiện Hành động.

Tốt hơn là cố gắng viết lại các chức năng tương tự xung quanh các hộp kiểm.

1

Vì vậy, tôi đã cố gắng để làm một điều tương tự, ngoại trừ tôi đã có nhiều hộp kiểm và sau đó một trong đó sẽ là vô nghĩa để có thể lựa chọn trong conjuction với những người khác. Tôi đã thực hiện hai người nghe riêng biệt và đặt một mục đích chung cho các hộp chính, và một mục tiêu chuyên biệt cho ngoại lệ.

@FXML private CheckBox redCB = new CheckBox(); 
@FXML private CheckBox blueCB = new CheckBox(); 
@FXML private CheckBox greenCB = new CheckBox(); 
@FXML private CheckBox whiteCB = new CheckBox(); 
@FXML private CheckBox blackCB = new CheckBox(); 
@FXML private CheckBox colorlessCB = new CheckBox(); 

//assigning listeners 
redCB.selectedProperty().addListener(colorCheckChange); 
blueCB.selectedProperty().addListener(colorCheckChange); 
greenCB.selectedProperty().addListener(colorCheckChange); 
whiteCB.selectedProperty().addListener(colorCheckChange); 
blackCB.selectedProperty().addListener(colorCheckChange); 
colorlessCB.selectedProperty().addListener(colorlessCheckChange); 
         //note: this is the only different one^^^ 

//making listeners 
ChangeListener colorCheckChange = new ChangeListener<Boolean>() { 
    @Override 
    public void changed(ObservableValue<? extends Boolean> ov, 
     Boolean old_val, Boolean new_val) { 
     if (new_val) 
      colorlessCB.setSelected(false); 
    }}; 
ChangeListener colorlessCheckChange = new ChangeListener<Boolean>() { 
    @Override 
    public void changed(ObservableValue<? extends Boolean> ov, 
     Boolean old_val, Boolean new_val) { 
     if (new_val) 
     { 
      redCB.setSelected(false); 
      blueCB.setSelected(false); 
      greenCB.setSelected(false); 
      blackCB.setSelected(false); 
      whiteCB.setSelected(false); 
     } 
    } 
}; 

Phần đầu tiên về cơ bản chỉ đảm bảo rằng colorlessCB không được chọn khi cố gắng chọn các màu khác và ngược lại. Bằng cách này, bạn cũng tránh được vấn đề của việc chọn một, và người kia sẽ tự động chọn lại chính nó.

1

Đây là giải pháp của tôi. Nhưng hãy chắc chắn về biến số a để phù hợp với bạn

//First in FXML file 
<CheckBox fx:id="chkbxAuto" mnemonicParsing="false" onAction="#autoConfig" text="Auto" /> 

// in controler 
public class FXMLController implements Initializable { 
    private static int a = 0; 
    //references to lables 
    .... 
    @FXML 
    private Label lblStateValue; 
    @FXML 
    private Group grpSetting; // a group of elements which I want to be disabled and enabled 
    ... 
    @FXML 
    private void autoConfig(ActionEvent event) { 
      System.out.println("Configing automatically"); 
      a++; 
      if(a%2==1){ 
       lblStateValue.setText("Auto configuration enabled"); // it change a lable to show the state 
       grpSetting.setDisable(true); // it disable a group of elements 
      } 
      else{ 
       lblStateValue.setText("Auto configuration disabled"); 
       grpSetting.setDisable(false); 
      } 
      a%=10; 

     } 
    ... 
Các vấn đề liên quan