2012-08-27 18 views
17

Sono incappato in un problema con i Combobox in javafx2.2. Questo è lo scenario:Problema di svuotamento casella Combo

  • Gli utenti fanno clic sul pulsante "modificaFile".
  • Un altro riquadro diventa visibile (con il metodo setVisible).

Questo riquadro contiene 6 caselle combinate. Tre di questi hanno elementi fissi: cboReport, cboSales, cboSend. Tre di loro ottenere i loro dati da un db (ObservableList) e ottenere popolato quando il riquadro diventa visibile: cboFile, cboCustomer, cboVet

  • l'utente seleziona un numero di file dal cboFile. Il resto delle caselle combinate è impostato con i valori corretti.
  • L'utente preme il pulsante di salvataggio, il file viene salvato come previsto.
  • Successivamente l'utente preme un pulsante di chiusura.

Quando la finestra si chiude, i dati nel riquadro vengono reimpostati tramite un metodo resetGUI_editFilePane(). C'è avere linee come:

... 
cboReport.getSelectionModel().clearSelection(); 
cboSales.getSelectionModel().clearSelection(); 
cboSend.getSelectionModel().clearSelection(); 
cboFile.getSelectionModel().clearSelection(); 
cboCustomer.getSelectionModel().clearSelection(); 
cboVet.getSelectionModel().clearSelection(); 

cboFile.getItems().clear(); 
cboCustomer.getItems().clear(); 
cboVet.getItems.clear(); 
... 

Quando l'utente apre nuovamente il riquadro premendo il pulsante 'editFile' noto che solo i comboboxes 'elemento fisso' hanno chiarito la loro selezione, i dynamicly pieno comboboxes mostro l'ultimo selezionato articolo anche se il valore della selezione stessa è null. Mi sembra un bug grafico o sto facendo qualcosa di sbagliato?

Esiste un modo per aggirare questo problema o qual è il metodo migliore per reimpostare una casella combinata?

EDIT 2014/08/27:
Questo non è ufficialmente un bug (clearSelection() non lo fa un chiaro valore):
https://bugs.openjdk.java.net/browse/JDK-8097244

La "soluzione" ufficiale è quello di cancellare il valore della ComboBox dopo aver annullato la selezione.

cb.getSelectionModel().clearSelection(); 
// Clear value of ComboBox because clearSelection() does not do it 
cb.setValue(null); 

risposta

14

mi sono imbattuto in quasi la stessa identica situazione e mi sono imbattuto tua domanda durante la ricerca di una soluzione. Fortunatamente, ho trovato una soluzione che obbliga i ComboBox a resettare. Quando si ripristinano i dati sul riquadro, invece di fare qualcosa di simile:

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

fare qualcosa di simile ...

parentNode.getChildren().remove(cboVet); 
cboVet = new ComboBox(); // do whatever else you need to format your ComboBox 
parentNode.add(cboVet); 

Avrete anche bisogno di fare un setItems() di nuovo sul tuo ComboBox in modo che il nuovo sarà popolato. Questa non è una soluzione ideale, ma sembra funzionare come mi aspetto il metodo clearSelection() fornito.

+2

Per coloro che sono 1.7.25+, facendo un _myCombobox.getSelectionModel() clearSelection();. _ ha funzionato bene per me. Non c'è bisogno di rimuovere l'intera combobox o qualsiasi altra cosa – francisOpt

+1

La risposta di Himmanshu è molto più semplice ... – zaxy78

2

Io uso riflessione con la manipolazione diretta di campo buttonCell in pelle ComboBox:

@SuppressWarnings({ "rawtypes", "unchecked" }) 
public static <T> void resetComboBox(ComboBox<T> combo) { 
    Skin<?> skin = combo.getSkin(); 
    if(skin==null){ 
     return; 
    } 
    combo.setValue(null); 
    Field buttonCellField; 
    try { 
     buttonCellField = skin.getClass().getDeclaredField("buttonCell"); 
     buttonCellField.setAccessible(true); 
     ListCell buttonCell = (ListCell) buttonCellField.get(skin); 
     if(buttonCell!=null){ 
      StringProperty text = buttonCell.textProperty(); 
      text.set(""); 
      buttonCell.setItem(null); 
     } 
    } catch (NoSuchFieldException 
      | SecurityException 
      | IllegalArgumentException 
      | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 

} 

Penso che sia anche possibile, fornendo una propria implementazione buttonCell attraverso la proprietà buttonCellFactory

8

È possibile recuperare gli elementi e li hanno tutto rimosso:

cboVet.getItems().removeAll(cboVet.getItems()); 
+0

L'unico modo che funziona. Grazie! – codingpuss

1

Ho avuto lo stesso problema con un ComboBox. Il buttonCell del ComboBox non viene aggiornato correttamente quando cambio gli elementi del ComboBox. Questo sembra un bug grafico.

Uso la manipolazione diretta del campo buttonCell in ComboBox.

combo.getButtonCell().setText(""); 
combo.getButtonCell().setItem(null); 

Questa è la soluzione migliore che ho trovato senza ricreare il ComboBox.

+0

non ha funzionato per me :( – zaxy78

2

Ho appena testato una soluzione di lavoro con il Java JDK 1.7.11:

combobox.setSelectedItem(null); 
combobox.setValue(null); 

Speranza che aiuta :)

1

Per cancellare SelectionModel ho trovato niente di meglio che creare una nuova istanza di Combobox (precedente aggiornamento risposte):

myParentNode.getChildren().remove(myCombobox); 
myCombobox = new ComboBox(); 
myParentNode.add(myCombobox); 

Ma questa soluzione si evolve altri problemi: se si utilizza fxml, questo combobox sarà collocato nel posto sbagliato e con il parametro sbagliato S. Alcuni parametri fxml sono difficilmente riprodotti direttamente dal codice di classe del controller e questo è terribile farlo ogni volta che è necessario cancellare la casella combinata.

La soluzione utilizza componenti personalizzati anziché creare istanze direttamente nel codice di classe del controller principale, anche se questi componenti sono standard. Ciò aiuta anche a liberare alcune righe nella classe del controller principale spostando i metodi di evento relativi ai componenti e altri metodi in un file di classe separato, in cui si utilizza un riferimento alla classe del controller principale.

Come creare componenti personalizzati in JavaFX L'applicazione FXML può essere trovata in http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm, ma si noti che la classe CustomControlExample non è necessaria per ogni componente personalizzato nell'applicazione, se ha già una classe del punto di ingresso con il metodo start (Satge stage) .

come risolvere eventuali errori con riferimento dalla classe controller componente personalizzato alla classe controller principale può essere trovato in JavaFx: how to reference main Controller class instance from CustomComponentController class?

13

E 'molto semplice. Hai solo bisogno di lavorare con la proprietà value di ComboBox. qui si va ....

ComboBox c; 
c.valueProperty().set(null); 

Spero che questo funziona per voi :-D

+2

grazie MOLTO !! mi ha salvato la giornata questa è la risposta effettiva a questa domanda – Kalaschni

+0

Felice di aiutare Kalaschni. Sono contento che questa soluzione ha funzionato per voi. –

+1

questo è anche il modo ufficiale per "risolverlo". vedere la modifica 2014/08/27 sopra. – Kalaschni

Problemi correlati