2014-03-06 49 views
2

當我嘗試使用下面的代碼清除組合框:的Java FX組合框復位問題

代碼:

public class ComboController implements Initializable 
{ 

@FXML 
ComboBox firstcombobox=new ComboBox(); 
@FXML 
ComboBox secondcombobox=new ComboBox(); 
@Override 
public void initialize(URL arg0, ResourceBundle arg1) { 
    // TODO Auto-generated method stub 
    firstcombobox.getItems().add("firabc"); 
    firstcombobox.getItems().add("firbcd"); 

    secondcombobox.getItems().add("seccde"); 
    secondcombobox.getItems().add("secdef"); 
} 
@FXML 
public void firstcomboboxAction() 
{ 
    secondcombobox.getSelectionModel().clearSelection(); 
    secondcombobox.getItems().clear(); 
    System.out.println(firstcombobox.getSelectionModel().getSelectedItem()); 
} 

public void secondcomboboxAction() 
{ 
    System.out.println(secondcombobox.getSelectionModel().getSelectedItem()); 
    System.out.println("my name is vinay"); 
} 

} 

它會自動調用動作事件

首先,我選擇了「seccde」從第二個下拉框 然後我從第一個組合框中選擇「firabc」

我收到的輸出是:

seccde 
my name is vinay 
null 
my name is vinay 
firabc 

,但它應該是:

seccde 
my name is vinay 

firabc [with an empty firstcombobox] 

FXML:

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="application.ComboController"> 
<ComboBox fx:id="firstcombobox" onAction="#firstcomboboxAction" > 
<ComboBox fx:id="secondcombobox" onAction="#secondcomboboxAction" > 
+0

你想要什麼?它完美的作品! –

+0

我正在做一個數據庫search.when我試圖清除這些組合框,然後調用它的相關操作自動導致null poiner錯誤,因爲我已經刪除了搜索條件 – vinay

+0

首先顯示您的整個代碼! –

回答

0

輸出正是你應該期待什麼。

首先你在第二個組合框中選擇一些東西。這調用第二個組合框的處理程序,給出輸出

seccde 
my name is vinay 

然後您在第一個組合框中選擇一個項目。這將調用第一個組合框的處理程序。該組合框的處理程序首先清除第二個組合框中的所有項目,作爲副作用將第二個組合框的value屬性設置爲null。這會導致第二個組合框的操作處理程序被調用,生成輸出

null 
my name is vinay 

用於第二組合框中的處理程序然後生成輸出,當然在這一點上,第二

firabc 

組合框中將沒有項目。

這一切都符合ComboBox的Javadocs。特別地,描述docs for the onAction handler如下處理程序:

組合框的動作,每當在組合框值 屬性被改變時調用。這可能是由於值屬性爲 以編程方式更改,當用戶選擇彈出式對話框 中的項目時,或者在可編輯組合框的情況下,它可能是當用戶提供其自己的輸入(是通過TextField或其他輸入機制

+0

感謝您解釋原因: – vinay

2

使用此代碼,點擊按鈕事件之後正在重置您的組合框。

例如,

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

     @Override 
     public void handle(ActionEvent t) { 

      firstcombobox.getSelectionModel().clearSelection(); 
      firstcombobox.getItems().clear(); 

      secondcombobox.getSelectionModel().clearSelection(); 
      secondcombobox.getItems().clear(); 
      }    
     }); 

用此選項重置組合框。

謝謝..

+0

先生,第一個值設置爲第二個組合框,不要在第一個組合框中選擇值,然後嘗試在第一個組合框動作中重置其值,然後自動調用第二個組合框動作 – vinay

+0

@vinay:先顯示您的代碼! –

0

我使用changeListener解決了這個問題。

public class ComboController implements Initializable 
{ 
    @FXML 
    ComboBox firstcombobox=new ComboBox(); 
    @FXML 
    ComboBox secondcombobox=new ComboBox(); 
    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) 
    { 
     // adding elements to comboboxes 
     firstcombobox.getItems().add("firabc"); 
     firstcombobox.getItems().add("firbcd"); 

     secondcombobox.getItems().add("seccde"); 
     secondcombobox.getItems().add("secdef"); 

     // adding action to first combobox 
     firstcombobox.getSelectionModel().selectedItemProperty() 
       .addListener(new firstcomboboxAction()); 

     // adding action to second combobox 
     secondcombobox.getSelectionModel().selectedItemProperty() 
       .addListener(new secondcomboboxAction()); 

    } 

class firstcomboboxAction implements ChangeListener<String> 
{ 
    @Override 
    public void changed(ObservableValue<? extends String> observable,String oldValue, String newValue) { 

     if(newValue!=null) 
     { 
        secondcombobox.getSelectionModel().clearSelection(); 
        secondcombobox.getItems().clear(); 
        System.out.println(firstcombobox.getSelectionModel().getSelectedItem()); 
     } 
} 


class secondcomboboxAction implements ChangeListener<String> 
{ 
    @Override 
    public void changed(ObservableValue<? extends String> observable,String oldValue, String newValue) 
    { 
     System.out.println(secondcombobox.getSelectionModel().getSelectedItem()); 
     System.out.println("my name is vinay"); 
    } 
} 
} 

FXML:

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" 
fx:controller="application.ComboController"> 
<ComboBox fx:id="firstcombobox" > 
<ComboBox fx:id="secondcombobox" > 

輸出:

seccde 
my name is vinay 

firabc [with an empty firstcombobox]