2017-01-09 7 views
0

У меня проблема с обновлением интерфейса JavaFX TableView. После изменения наблюдаемого объекта он не обновляет пользовательский интерфейс TableView. Но если я выполню магический ритуал потянув вниз полосу прокрутки TableView - это, похоже, перерисовывает таблицу и обновляет элементы в ней. С помощью отладки я гарантировал, что PreferencesSet ArrayList и объект обновлены правильно.JavaFX TableView не сразу обновляется

Here's gif demonstration of what is happening

Это мой первый раз, задавая вопрос здесь, так что я мог бы уйти некоторые важные данные. Не стесняйтесь спрашивать меня об этом. Заранее спасибо.

Вот код (я опустил несвязанный материал):

ControllerClass: класс

public class TestSomethingController implements Initializable { 

public TableView<PreferenceValues.PreferencesSet> preferencesTable; 
public TableColumn mdColumn; 
public TableColumn typeColumn; 
public TableColumn tradeColumn; 
public TableColumn plastColumn; 
public TableColumn capColumn; 
public TableColumn multColumn; 
public TableColumn sizeColumn; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    setNorthPanel(); 
    setTableColumns(); 
    fillAllInfo(); 
} 

private void setTableColumns() { 
    mdColumn.setCellValueFactory(new PropertyValueFactory<PreferenceValues.PreferencesSet, MarketDirection>("md")); 
    typeColumn.setCellValueFactory(new PropertyValueFactory<PreferenceValues.PreferencesSet, UserOfferType>("type")); 
    tradeColumn.setCellValueFactory(new PropertyValueFactory<PreferenceValues.PreferencesSet, Boolean>("trade")); 
    plastColumn.setCellValueFactory(new PropertyValueFactory<PreferenceValues.PreferencesSet, Long>("plast")); 
    capColumn.setCellValueFactory(new PropertyValueFactory<PreferenceValues.PreferencesSet, Double>("cap")); 
    multColumn.setCellValueFactory(new PropertyValueFactory<PreferenceValues.PreferencesSet, Double>("mult")); 
    sizeColumn.setCellValueFactory(new PropertyValueFactory<PreferenceValues.PreferencesSet, Long>("size")); 
}  
private void fillAllInfo() { 
    preferencesTable.setItems(FXCollections.observableArrayList(CurrentSession.currentUser.getPreferencesList())); 
    fillNorthPanel(); 
} 
public void applyClicked(ActionEvent actionEvent) { 
    applyNorthPanelChanges(); 
} 
private void applyNorthPanelChanges() { 
    PreferenceValues.PreferencesSet preferencesSet = CurrentSession.currentUser.getPreferencesSet(dirChoiceBox.getSelectionModel().getSelectedItem(), offerTypeChoiceBox.getSelectionModel().getSelectedItem()); 
    preferencesSet.setTrade(tradeCheckBox.isSelected()); 
    preferencesSet.setPlast(plastSpinner.getValue()); 
    preferencesSet.setCap(capRateSpinner.getValue()); 
    preferencesSet.setMult(multSpinner.getValue()); 
    preferencesSet.setSize(sizeSpinner.getValue()); 
    preferencesSet.savePreferences(); 
} 

Пользователя:

public class User { 

private PreferenceValues preferenceValues; 


public PreferenceValues.PreferencesSet getPreferencesSet(MarketDirection md, UserOfferType userOfferType) { 
    return preferenceValues.getPreferencesSet(md, userOfferType); 
} 

public ArrayList<PreferenceValues.PreferencesSet> getPreferencesList() { 
    return preferenceValues.getPreferencesList(); 
} 
} 

PreferenceValues ​​класс:

import java.util.ArrayList; 
import java.util.TreeMap; 
import java.util.prefs.BackingStoreException; 
import java.util.prefs.Preferences; 

public class PreferenceValues { 
private Preferences preferences; 
private ArrayList<PreferencesSet> preferencesList; 
private TreeMap<String, PreferencesSet> preferencesMap; 

public PreferenceValues(User user) { 
    preferencesList = new ArrayList<>(); 
    preferencesMap = new TreeMap<>(); 
    preferences = Preferences.userRoot().node("prefexample" + user.getwmId()); 
    for (MarketDirection md : MarketDirection.values()) { 
     for (UserOfferType userOfferType : UserOfferType.values()) { 
      if (userOfferType != UserOfferType.UNDEF) { 
       PreferencesSet preferencesSet = new PreferencesSet(md, userOfferType, preferences); 
       preferencesList.add(preferencesSet); 
       preferencesMap.put(md.toString() + userOfferType.toString(), preferencesSet); 
      } 
     } 
    } 
} 

protected ArrayList<PreferencesSet> getPreferencesList() { 
    return preferencesList; 
} 

private String getMapKey(MarketDirection md, UserOfferType userOfferType) { 
    return md.toString() + userOfferType.toString(); 
} 

protected PreferencesSet getPreferencesSet(MarketDirection md, UserOfferType userOfferType) { 
    return preferencesMap.get(getMapKey(md, userOfferType)); 
} 

public void clear() throws BackingStoreException { 
    preferences.clear(); 
} 


public class PreferencesSet { 
Preferences preferences; 

private MarketDirection md; 
private UserOfferType type; 
private boolean trade; 
private int plast; 
private double cap; 
private double mult; 
private int size; 


public PreferencesSet(MarketDirection md, UserOfferType type, Preferences preferences) { 
    this.md = md; 
    this.type = type; 
    this.preferences = preferences; 
    trade = preferences.node(md.toString()).node(type.toString()).getBoolean("trade", false); 
    plast = preferences.node(md.toString()).node(type.toString()).getInt("plast", 222); 
    cap = preferences.node(md.toString()).node(type.toString()).getDouble("cap", 333); 
    mult = preferences.node(md.toString()).node(type.toString()).getDouble("mult", 1); 
    size = preferences.node(md.toString()).node(type.toString()).getInt("size", 15000); 
} 

public void savePreferences() { 
    preferences.node(md.toString()).node(type.toString()).putBoolean("trade", trade); 
    preferences.node(md.toString()).node(type.toString()).putInt("plast", plast); 
    preferences.node(md.toString()).node(type.toString()).putDouble("cap", cap); 
    preferences.node(md.toString()).node(type.toString()).putDouble("mult", mult); 
    preferences.node(md.toString()).node(type.toString()).putInt("size", size); 
} 

public MarketDirection getMd() { 
    return md; 
} 

public UserOfferType getType() { 
    return type; 
} 

public boolean isTrade() { 
    return trade; 
} 

public int getPlast() { 
    return plast; 
} 

public double getCap() { 
    return cap; 
} 

public double getMult() { 
    return mult; 
} 

public int getSize() { 
    return size; 
} 

public void setTrade(boolean trade) { 
    this.trade = trade; 
} 

public void setPlast(int plast) { 
    this.plast = plast; 
} 

public void setCap(double cap) { 
    this.cap = cap; 
} 

public void setMult(double mult) { 
    this.mult = mult; 
} 

public void setSize(int size) { 
    this.size = size; 
} 
} 

} 

ответ

3

Поскольку только ва y для PropertyValueFactory для извлечения значения используется getter, изменения свойства не могут быть соблюдены, и поэтому обновление происходит только тогда, когда элемент связан с новым TableRow.

Начиная с JavaFX 8u60 вы можете просто вызвать метод refreshTableView, который заставит выполнить обновление.


Однако обычный способ сделать это - предоставить доступ к объекту свойства, содержащему значение свойства, например.

PreferencesSet В

private final IntegerProperty plast = new SimpleIntegerProperty(); 

public void setPlast(int plast) { 
    this.plast.set(plast); 
} 

public int getPlast() { 
    return plast.get(); 
} 

// this method will be used by the PropertyValueFactory 
// and returns a Property which notifies TableView of changes 
public IntegerProperty plastProperty() { 
    return plast; 
} 

Есть и другие типы недвижимости для других типов данных, см javafx.beans.property package

+0

Это работало. Спасибо большое! –