2012-12-05 20 views
10

का चयन करते समय जावाफाक्स ईवेंट ट्रिगर हुआ मेरा जावाएफएक्स FXML एप्लिकेशन में कोई समस्या है।चेक बॉक्स

जब मैं किसी फॉर्म पर चेकबॉक्स का चयन करता हूं, तो मैं क्लिक किए गए चेकबॉक्स के आधार पर एक विधि निष्पादित करना चाहता हूं। क्या कोई तरीका है कि मैं विधि के माध्यम से चेकबॉक्स का नाम पास कर सकता हूं ताकि मैं उस पर कुछ सशर्त काम कर सकूं?

मेरे पास दो चेकबॉक्स हैं और केवल एक ही चुना जा सकता है। जब मैं एक पर क्लिक करता हूं, तो दूसरा डी-चयनित होना चाहिए और इसके विपरीत। जाहिर है नीचे दिया गया कोड काम नहीं करेगा, इसलिए मैं उस ऑब्जेक्ट का नाम पास करना चाहता हूं जिसे क्लिक किया गया था।

किसी भी मदद की सराहना की जाएगी, बहुत धन्यवाद।

@FXML private void updateRcs(){ 

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

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

} 

उत्तर

22

आप परिवर्तन ट्रैकिंग का उपयोग कर सकते हैं या जावाएफएक्स के इवेंट हैंडलिंग तंत्र का उपयोग कर सकते हैं।
इस तरह चेक बॉक्स के साथ,

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

ट्रैकिंग बदलें

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); 
    } 
}); 

निपटने

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

नहीं रेडियो बटन आप एक पारस्परिक रूप से विशिष्ट चयन देना चाहेंगे घटना का उपयोग करना? बस सुनिश्चित करें कि आप समूहनाम को समान मानते हैं - एक का चयन करने के बाद स्वचालित रूप से दूसरे का चयन रद्द हो जाएगा और आप केवल एक्शन इवेंट में अतिरिक्त तर्क डाल सकते हैं।

चेकबॉक्स के आसपास समान कार्यक्षमता को दोबारा लिखने की कोशिश करने से बेहतर।

1

तो मैं एक समान काम करने की कोशिश कर रहा था, सिवाय इसके कि मेरे पास एकाधिक चेकबॉक्स थे और फिर एक जो दूसरों के साथ संयोजन में चयन करने के लिए गैरकानूनी होगा। मैंने दो अलग श्रोताओं को बनाया और एक सामान्य उद्देश्य को मुख्य बक्से में सेट किया, और अपवाद के लिए एक विशेष व्यक्ति।

@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); 
     } 
    } 
}; 

पहले एक मूल रूप से बस सुनिश्चित करें कि colorlessCB अन्य रंग का चयन करने के प्रयास में नहीं चुना गया है, और इसके verca बनाता है। इस तरह आप एक को चुनने की समस्या से भी बचते हैं, और दूसरा स्वचालित रूप से स्वयं को चुनौती देता है।

1

यह मेरा समाधान है। लेकिन a वैरिएबल के लिए उपयुक्त होने के बारे में सुनिश्चित करें

//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; 

     } 
    ... 
संबंधित मुद्दे