2012-12-27 14 views
7

Recentemente ho iniziato a lavorare con JavaFX e ho iniziato a creare versioni FX dei miei componenti Swing personalizzati. Uno di questi era un timer per il conto alla rovescia, nel quale era coinvolto uno JProgressBar. Disegnerei l'ora corrente sulla barra usando il suo metodo setString(String). Sfortunatamente, non sembra esserci un tale metodo con lo ProgressBar di JavaFX. La cosa più vicina che ho visto a ciò che cercavo era questa:Disegna una stringa su una barra di avanzamento, come JProgressBar?

timer (source)

Non so se ciò richiederebbe un intero nuovo componente personalizzato, o semplicemente una classe come java.awt.Graphics.

Qualsiasi aiuto sarebbe molto apprezzato. Grazie :)

risposta

12

Ecco un esempio che (penso) fa quello che la tua domanda sta chiedendo.

class ProgressIndicatorBar extends StackPane { 
    final private ReadOnlyDoubleProperty workDone; 
    final private double totalWork; 

    final private ProgressBar bar = new ProgressBar(); 
    final private Text  text = new Text(); 
    final private String  labelFormatSpecifier; 

    final private static int DEFAULT_LABEL_PADDING = 5; 

    ProgressIndicatorBar(final ReadOnlyDoubleProperty workDone, final double totalWork, final String labelFormatSpecifier) { 
    this.workDone = workDone; 
    this.totalWork = totalWork; 
    this.labelFormatSpecifier = labelFormatSpecifier; 

    syncProgress(); 
    workDone.addListener(new ChangeListener<Number>() { 
     @Override public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) { 
     syncProgress(); 
     } 
    }); 

    bar.setMaxWidth(Double.MAX_VALUE); // allows the progress bar to expand to fill available horizontal space. 

    getChildren().setAll(bar, text); 
    } 

    // synchronizes the progress indicated with the work done. 
    private void syncProgress() { 
    if (workDone == null || totalWork == 0) { 
     text.setText(""); 
     bar.setProgress(ProgressBar.INDETERMINATE_PROGRESS); 
    } else { 
     text.setText(String.format(labelFormatSpecifier, Math.ceil(workDone.get()))); 
     bar.setProgress(workDone.get()/totalWork); 
    } 

    bar.setMinHeight(text.getBoundsInLocal().getHeight() + DEFAULT_LABEL_PADDING * 2); 
    bar.setMinWidth (text.getBoundsInLocal().getWidth() + DEFAULT_LABEL_PADDING * 2); 
    } 
} 

A complete executable test harness è inoltre disponibile.

Esempio output del programma:

labeledprogressbar

+0

Questo è esattamente quello che stavo cercando. Grazie :) – mattbdean