2017-04-20 173 views
1

我有一個名爲verreGcomboComboBox,其中填充的項目類型爲Verre,我面對的問題是當我想從中選擇一個值時,總是無法在第一次和第二次點擊時更改其值,所以我總是必須使用箭頭導航和選擇項目,或者點擊三次以上來選擇項目。這個問題不存在與其他組合框(其中項目數不超過5),這裏是我的代碼:JavaFX Combobox不會更改爲點擊第一次和第二次點擊的值

List<Verre> ListeVerres = em.createQuery("SELECT v FROM Verre v").getResultList(); 
     ObservableList<Verre> dataVerres = FXCollections.observableList(ListeVerres); 
     ListeVerres.add(null); 

     verreGcombo.setCellFactory((comboBox) -> { 
      return new ListCell<Verre>() { 
       @Override 
       protected void updateItem(Verre item, boolean empty) { 
        super.updateItem(item, empty); 

        if (item == null || empty) { 
         setText("Choisir"); 
         verreGcombo.getSelectionModel().clearSelection(); 
         //verreGcombo.getItems().clear(); 
        } else { 
         setText(item.getMatiere() + " " + item.getType()); 
        } 
       } 
      }; 
     }); 

// Define rendering of selected value shown in ComboBox. 
     verreGcombo.setConverter(new StringConverter<Verre>() { 
      @Override 
      public String toString(Verre verre) { 
       if (verre == null) { 
        return "Choisir"; 
       } else { 
        return verre.getMatiere() + " " + verre.getType(); 
       } 
      } 

      @Override 
      public Verre fromString(String articleString) { 
       return null; // No conversion fromString needed. 
      } 
     }); 

     verreGcombo.setOnAction((e) -> { 

      Verre verreG = verreGcombo.getSelectionModel().getSelectedItem(); 

      if (verreG != null) { 

       verreGprixT.setText(setFloat(verreG.getArticle().getPrixVenteTTC())); 
       verreGPrixHR = verreG.getArticle().getPrixVenteTTC(); 
       verreGRemise = (verreGPrixHR * verreG.getArticle().getRemise())/100; 
       verreGPrix = verreGPrixHR - verreGRemise; 
       indice.setText(setFloat(verreG.getIndice())); 
       verreGfield.setText(verreG.getMatiere() + " " + verreG.getType()); 

      } else { 
       verreGprixT.setText(setFloat(0)); 
       verreGPrixHR = 0; 
       verreGRemise = 0; 
       verreGPrix = 0; 
       indice.setText(setFloat(0)); 
       verreGfield.setText(""); 

      } 
     }); 

     verreGcombo.setItems(dataVerres); 

回答

1

你有一個EventFilter添加到您Comboboxs並聽取鼠標點擊,所以你可以改變每當用戶使用鼠標點擊一個項目時的值。以下是您必須添加以解決問題的代碼。

verreGcombo.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { 
    public void handle(MouseEvent e) { 
     Verre verreG = verreGcombo.getSelectionModel().getSelectedItem(); 

      if (verreG != null) { 

       verreGprixT.setText(setFloat(verreG.getArticle().getPrixVenteTTC())); 
       verreGPrixHR = verreG.getArticle().getPrixVenteTTC(); 
       verreGRemise = (verreGPrixHR * verreG.getArticle().getRemise())/100; 
       verreGPrix = verreGPrixHR - verreGRemise; 
       indice.setText(setFloat(verreG.getIndice())); 
       verreGfield.setText(verreG.getMatiere() + " " + verreG.getType()); 

      } else { 
       verreGprixT.setText(setFloat(0)); 
       verreGPrixHR = 0; 
       verreGRemise = 0; 
       verreGPrix = 0; 
       indice.setText(setFloat(0)); 
       verreGfield.setText(""); 
     } 
    }; 
}); 

我希望這個代碼能夠解決您的問題。

+0

它確實解決了它,但我不知道爲什麼其他組合框沒有MouseEvent處理程序,我認爲它與項目列表的長度有關 –

相關問題