2015-05-03 100 views
-1

我有組合框,我想用它來配置服務延遲時間:設置自定義值,組合框

import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.geometry.Insets; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.Label; 
import javafx.scene.layout.GridPane; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class MainApp extends Application 
{ 
    public static void main(String[] args) 
    { 
     launch(args); 
    } 

    private MyService myService = new MyService(); 

    @Override 
    public void start(Stage stage) 
    { 
     myService.setDelay(new Duration(300)); 
     myService.setPeriod(new Duration(1000)); 

     myService.start(); 
     stage.setTitle("ComboBoxSample"); 
     Scene scene = new Scene(new Group(), 450, 250); 

     ComboBox emailComboBox = new ComboBox(); 
     emailComboBox.getItems().addAll("Stop", "1 Second", "5 Seconds", "10 Seconds", "15 Seconds"); 
     emailComboBox.setPromptText("Email address"); 
     emailComboBox.valueProperty().addListener(new ChangeListener<String>() 
     { 
      @Override 
      public void changed(ObservableValue ov, String t, String t1) 
      { 
       if (t1.equals("Stop")) 
       { 
        myService.cancel(); 
       } 
       if (t1.equals("1 Second")) 
       { 
        myService.setPeriod(new Duration(1000)); 
       } 
       if (t1.equals("5 Second")) 
       { 
        myService.setPeriod(new Duration(5000)); 
       } 
       if (t1.equals("10 Second")) 
       { 
        myService.setPeriod(new Duration(10000)); 
       } 
       if (t1.equals("15 Second")) 
       { 
        myService.setPeriod(new Duration(15000)); 
       } 
      } 
     }); 

     GridPane grid = new GridPane(); 
     grid.setVgap(4); 
     grid.setHgap(10); 
     grid.setPadding(new Insets(5, 5, 5, 5)); 
     grid.add(new Label("To: "), 0, 0); 
     grid.add(emailComboBox, 1, 0); 

     Group root = (Group) scene.getRoot(); 
     root.getChildren().add(grid); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 

有沒有減少,我用它來設置服務太多,如果()開關的情況下任何取巧的方法延遲期。 我想添加emailComboBox.setEditable(true);並基於我的自定義輸入我想設置服務延遲期。

+1

如果格式將是'XX秒'然後你可以簡單地在空間上使用String Tokenize來獲得第一個數字,使用'Integer.parseInt()'把它作爲'int'獲得,然後乘以1000毫秒。如果它無法解析爲具有異常的int,則假定它是'停止'或輸入錯誤並調用'cancel()'。 –

+0

@AaronD你能告訴我一些代碼示例嗎? –

+1

似乎真的不應該在'ComboBox'中首先使用'String's ...... –

回答

1

由於用戶有效選擇Duration,因此ComboBox的數據類型應爲Duration,而不是String。安裝電池工廠,配置Duration對象是如何顯示在組合框中:

ComboBox<Duration> combo = new ComboBox<>(
      FXCollections.observableArrayList(
       Duration.UNKNOWN, 
       Duration.seconds(1), 
       Duration.seconds(5), 
       Duration.seconds(10), 
       Duration.seconds(15))); 

    combo.setCellFactory(lv -> createListCell()); 
    combo.setButtonCell(createListCell()); 

    combo.valueProperty().addListener((obs, oldValue, newValue) -> { 
     if (newValue == null || newValue == Duration.UNKNOWN) { 
      myService.cancel(); 
     } else { 
      myService.setPeriod(newValue); 
     } 
    }); 

通過自定義單元實現看起來像

private ListCell<Duration> createListCell() { 
    return new ListCell<Duration>() { 
     @Override 
     public void updateItem(Duration item, boolean empty) { 
      super.updateItem(item, empty); 
      if (empty) { 
       setText(null); 
      } else { 
       if (item == Duration.UNKNOWN) { 
        setText("Stop"); 
       } else { 
        setText(String.format("%.0f Second", item.toSeconds())); 
       } 
      } 
     } 
    }; 
} 
+0

我在myService.setPeriod(newValue)之前加了''myService.restart();''服務沒有重新啓動後,我選擇停止。它是否正確? –

+0

是的。設置期限不會導致停止的服務啓動。 –