2015-02-02 5 views
1

У меня есть тема, которая permantly обновляет/создает список:JavaFX - Автоматическое обновление choiceBox

private ObservableList<String> query() { 
    try { 
     return FXCollections.observableArrayList(getWMIValue(query, fieldName)); 
    } catch (Exception e) { 
     return FXCollections.observableArrayList(""); 
    } 
} 

@Override 
public void run() { 
    while (true) { 
     devices = query(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(WmiAccess.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 

public ObservableList<String> getDevices() { 
    return devices; 
} 

и у меня есть контроллер FXML JavaFX, который добавляет, что список в ChoiceBox

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    wmiAccess = new WmiAccess(
      "SELECT * FROM Win32_PnPEntity", "Name" 
    ); 

    Thread wmiThread = new Thread(wmiAccess); 

    wmiThread.start(); 

    choiceBox.setItems(wmiAccess.getDevices()); 

} 

Мои Проблема заключается в следующем: ChoiceBox не обновляет свой контент автоматически. Как мне удалось обновить содержимое selectBox до любого значения, которое имеет список «devices»?

ответ

1

Два вопроса:

Во-первых, вы не обновляется один и тот же список, вы создаете новый, каждый раз, когда:

while (true) { 
    devices = query(); 
    // ... 
} 

просто присваивает новый список переменной devices на каждой итерации , Поскольку метод initialize() в контроллере просто получает ссылку один раз, когда вы обновляете devices в новый список, это больше не список, на который ссылается контроллер.

Вам нужно что-то вдоль линий

while (true) { 
    devices.setAll(query); 
    // ... 
} 

Вы должны убедиться, что devices правильно инициализирован, когда этот класс создается с devices = FXCollections.observableArrayList();.

На данный момент, вы, вероятно, не нужно query() вернуть наблюдаемый список больше, обычный список будет делать:

private List<String> query() { 
    try { 
     return getWMIValue(query, filename); // I'm guessing that returns a list... 
    } catch (Exception e) { 
     return Collections.emptyList(); 
    } 
} 

Второй вопрос заключается в том, что ваш не оконечное цикл выполняется в фоновый поток. Если devices - это список элементов в поле со списком, вы можете обновить его только в приложении приложения FX. Поэтому вам нужно сделать что-то вроде

while (true) { 
    List<String> latestDevices = query(); 
    Platform.runLater(() -> devices.setAll(latestDevices)); 
    // ... 
} 
+0

Большое вам спасибо, что эта работа, но, к сожалению, ведет меня непосредственно к другой проблеме. Возможно, это глупые вопросы, это первый случай, когда я когда-либо работаю со сложным gui извините заранее. Мой ChoiceBox теперь может перечислить все устройства, но как только я его выбрал, он напрямую сбрасывается, а ChoiceBox пуст, потому что поток обновляет список. Как я могу предотвратить мой выбор из удаленных? –

+0

Его сделали .... удалось исправить это сам. Использовал ComboBox вместо ChoiceBox. Everthing работает сейчас, как и предполагалось. еще раз спасибо –

Смежные вопросы