2012-12-04 10 views
5

Nel mio JavaFXTableView Ho un TableColumn su cui ho impostato Cell Factory per rendere ProgressBar e per altri TableColumn s Ho impostato Cell Factory per mostrare ToolTip. Come l'immagine qui sotto. La seconda colonna mostra la barra di avanzamento e altre 3 colonne sono renderizzate per mostrare il suggerimento, che ha valori di stringa semplici da mostrare.Impossibile visualizzare la punta dello strumento sul valore della cella JavaFX TableView

enter image description here

mi stavo problema in cui il TableView non mostrava/mostrando valori aggiornati nella tabella cioè interfaccia utente non sta convalidando/rinfrescante/dipingere le TableView elementi. Se ho cliccato su ColumnHeader per ordinare qualsiasi colonna, solo io posso vedere l'aggiornamento TableView. Ordinare manualmente la colonna della tabella per aggiornare il contenuto della tabella non ha senso quindi ho cercato e trovato la soluzione per mostrare/nascondere le colonne della tabella per l'aggiornamento della vista tabella.

Per risolvere il problema, ho scritto un codice qui sotto per risolvere il problema di aggiornamento/aggiornamento TableView ma a causa di questo codice ora ToolTip non sono visibili.

codice per aggiornare Table View dopo ogni intervallo specifico

class TableProgressBarUpdator implements Runnable { 

     TableView table; 

     public TableProgressBarUpdator(TableView fxtable) { 
      table = fxtable; 

     } 

     public void start() { 
      new Thread(this).start(); 
     } 

     public void run() { 

      while (keepUpdating) { 
       try { 
        updateProgressbar(); 
        Thread.sleep(1000); 
       } catch (Exception e) { 
        LogHandler.doErrorLogging("Error while updating tables cell", e); 
       } 
      } 
      LogHandler.doDebugLogging("Table process repainting is completed."); 
     } 

     private void updateProgressbar() throws Exception { 
      Platform.runLater(new Runnable() { 
       @Override 
       public void run() { 
        ((TableColumn) table.getColumns().get(0)).setVisible(false); 
        ((TableColumn) table.getColumns().get(0)).setVisible(true); 
       } 
      }); 


     } 
    } 

avviare l'aggiornamento Table View

public void startUpdatingTableProgress() { 
    keepUpdating = true; 
    TableProgressBarUpdator tpu = new TableProgressBarUpdator(table); 
    tpu.start(); 
} 

interrompere l'aggiornamento Table View

public void stopUpdatingTableProgress() { 
     keepUpdating = false; 
    } 

Aggiunta di più codice che mostra le classi di rendering per mostrare la barra di avanzamento e visualizzare il suggerimento dello strumento.

Codice per mostrare la vista tabella della barra di avanzamento.

public static class ProgressBarTableCell<S, T> extends TableCell<S, T> { 

     private final ProgressBar progressBar; 
     private ObservableValue<T> ov; 

     public ProgressBarTableCell() { 
      this.progressBar = new ProgressBar(); 
      progressBar.setPrefHeight(23); 
      setAlignment(Pos.CENTER); 
     } 

     @Override 
     public void updateItem(T item, boolean empty) { 
      super.updateItem(item, empty); 
      if (item == null) { 
       setGraphic(null); 
       setText(null); 
      } else { 
       if (item.toString().equalsIgnoreCase("Processing")) { 
        Platform.runLater(new Runnable() { 
         @Override 
         public void run() { 

          if (getGraphic() == null) { 
           setGraphic(progressBar); 
           progressBar.setProgress(-1); 
          } else { 
           ProgressBar objpProgressBar = (ProgressBar) getGraphic(); 
           objpProgressBar.setProgress(-1); 
          } 
          setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
         } 
        }); 
       } else { 
        Platform.runLater(new Runnable() { 
         @Override 
         public void run() { 
          if (getGraphic() == null) { 
           setGraphic(progressBar); 
           progressBar.setProgress(0); 
          } else { 
           ProgressBar objpProgressBar = (ProgressBar) getGraphic(); 
           objpProgressBar.setProgress(0); 
          } 
          setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
         } 
        }); 
       } 
      } 
     } 
    } 

codice per mostrare la punta dello strumento

public class ToolTip extends TableCell { 

     @Override 
     protected void updateItem(Object object, boolean selected) { 
      if (object == null) { 
       setGraphic(null); 
       setText(null); 
      }else{ 
       setText(object.toString()); 
       setTooltip(new Tooltip(object.toString())); 
      } 
     } 
    } 

Edizione -

Se io commento-out queste due linee da TableProgressBarUpdator Classe allora io sono in grado di vedere Strumento Suggerimento per ogni valore di cella nella 1a, 3a e 4a colonna, ma ora il contenuto della Vista tabella non si aggiorna/si aggiorna e quando I UN-commenta questi linee non riesco a vedere la punta dello strumento.

((TableColumn) table.getColumns().get(0)).setVisible(false); 
((TableColumn) table.getColumns().get(0)).setVisible(true); 

In tutto a causa di queste due linee il mio suggerimento strumento Render non funziona e se rimuovo queste due righe poi Table View Content non sono rinfrescanti/Aggiornamento.

risposta

3

Non è necessario aggiornare manualmente . potrebbe esserci un problema nella classe associato a quello TableView's column.

è necessario creare classe come indicato di seguito:

public static class Test{ 

private StringProperty name; 

private Test() { 
    name = new SimpleStringProperty(); 
} 

public Test(String name) { 
    this.name = new SimpleStringProperty(name); 
} 

public void setName(String name) { 
    this.name.set(name); 
} 

public String getName() { 
    return name.get(); 
} 

public StringProperty nameProperty() { 
    return name; 
} 

}

1

Sei sicuro di aver bisogno della chiamata Platform.runLater() all'interno di ProgressBarTableCell? Mi aspetterei che sia già nel thread dell'applicazione. Ciò potrebbe causare l'aggiornamento della barra di avanzamento da collocare alla fine della coda nel thread dell'applicazione, dopo l'aggiornamento della tabella pianificata.

Il valore per TableCell è racchiuso in ObservableProperty (sembra che si debba avere una proprietà SimpleString)? Se lo hai fatto, la tabella dovrebbe riconoscere che ha bisogno di un aggiornamento e non dovresti ricorrere alla commutazione della visibilità della colonna come un hack per forzare l'aggiornamento della tabella.

+0

devo commentare-out Platform.runLater(), ma ancora senza fortuna. Sto usando SimpleStringProperty per impostare/ottenere valori e questi valori sono associati alle colonne. –

Problemi correlati