JavaFX TableView未立即更新

JavaFX TableView未立即更新,java,user-interface,javafx,tableview,Java,User Interface,Javafx,Tableview,我对JavaFXTableViewUI更新有问题。更改可观察对象后,它不会更新TableView的UI。但是,如果我执行一个神奇的仪式,将TableView的滚动条上下拉动,它似乎会重新绘制表格并更新其中的项目。 通过调试,我确保了PreferenceSetArrayList和object的更新是正确的 这是我第一次在这里问问题,所以我可以省略一些重要的信息。请随便问我要。先谢谢你 下面是代码(我省略了不相关的内容): 控制器类: public class TestSomethingContr

我对JavaFX
TableView
UI更新有问题。更改可观察对象后,它不会更新
TableView
的UI。但是,如果我执行一个神奇的仪式,将
TableView
的滚动条上下拉动,它似乎会重新绘制表格并更新其中的项目。 通过调试,我确保了PreferenceSetArrayList和object的更新是正确的

这是我第一次在这里问问题,所以我可以省略一些重要的信息。请随便问我要。先谢谢你

下面是代码(我省略了不相关的内容):

控制器类:

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();
}
公共类TestSomethingController实现可初始化{
公共表视图偏好稳定;
公共表格栏;
公共表列类型列;
公共表格栏目;
公共表格栏目;
公共表格栏目;
公共表列多列;
公共表列大小列;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
setNorthPanel();
setTableColumns();
fillAllInfo();
}
私有void setTableColumns(){
mdColumn.setCellValueFactory(新属性ValueFactory(“md”);
typeColumn.setCellValueFactory(新属性ValueFactory(“类型”);
tradeColumn.setCellValueFactory(新属性ValueFactory(“交易”));
plastColumn.setCellValueFactory(新属性ValueFactory(“plast”));
capColumn.setCellValueFactory(新的PropertyValueFactory(“cap”));
multColumn.setCellValueFactory(新属性值工厂(“mult”);
sizeColumn.setCellValueFactory(新属性ValueFactory(“大小”);
}      
私有void fillAllInfo(){
preferencesTable.setItems(FXCollections.observableArrayList(CurrentSession.currentUser.getPreferencesList());
fillNorthPanel();
}
公共作废applyClicked(ActionEvent ActionEvent){
applyNorthPanelChanges();
}
私有void applyNorthPanelChanges(){
PreferenceValues.PreferencesSet PreferencesSet=CurrentSession.currentUser.getPreferencesSet(dirChoiceBox.getSelectionModel().getSelectedItem(),offerTypeChoiceBox.getSelectionModel().getSelectedItem());
首选项set.setTrade(tradeCheckBox.isSelected());
首选项set.setPlast(plastSpinner.getValue());
首选项set.setCap(capRateSpinner.getValue());
preferencesSet.setMult(multSpinner.getValue());
首选项set.setSize(sizeSpiner.getValue());
首选项set.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();
}
}
公共类用户{
私人偏好价值观偏好价值观;
public PreferenceValues.PreferencesSet getPreferencesSet(MarketDirection md,UserOfferType UserOfferType){
返回preferenceValues.getPreferencesSet(md,userOfferType);
}
公共阵列列表getPreferencesList(){
返回preferenceValues.getPreferencesList();
}
}
首选值类别:

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;
}
}

}
import java.util.ArrayList;
导入java.util.TreeMap;
导入java.util.prefs.BackingStoreException;
导入java.util.prefs.Preferences;
公共类优先值{
私人偏好;
私人ArrayList优先列表;
私有树映射优先权;
公共首选项值(用户){
preferencesList=新的ArrayList();
preferencesMap=新树映射();
preferences=preferences.userRoot().node(“prefexample”+user.getwmId());
for(MarketDirection md:MarketDirection.values()){
对于(UserOfferType UserOfferType:UserOfferType.values()){
if(userOfferType!=userOfferType.undf){
PreferencesSet PreferencesSet=新的PreferencesSet(md、userOfferType、preferences);
preferencesList.add(preferencesSet);
preferencesMap.put(md.toString()+userOfferType.toString(),preferencesSet);
}
}
}
}
受保护的ArrayList getPreferencesList(){
返回优先列表;
}
私有字符串getMapKey(MarketDirection md,UserOfferType UserOfferType){
返回md.toString()+userOfferType.toString();
}
受保护的首选项Set GetPreferenceSet(MarketDirection md,UserOfferType UserOfferType){
返回preferencemap.get(getMapKey(md,userOfferType));
}
public void clear()引发BackingStoreException{
preferences.clear();
}
公共课优先{
偏好;
私人市场总监;
私有UserOfferType类型;
私人贸易;
私人int plast;
私人双帽;
私人双骡;
私有整数大小;
公共首选项集(MarketDirection md、UserOfferType类型、首选项){
this.md=md;
this.type=type;
这就是偏好=偏好;
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);
}
公共void savePreferences(){
preferences.node(md.toString()).node(type.toString()).putBoolean(“trade”,trade);
preferences.node(md.toString()).node(type.toString()).putin(“plast”,plast);
preferences.node(md.toString()).node(type.toString()).putdoull(“cap”,cap);
preferences.node(md.toString()).node(type.toString()).putdoull(“mult”,mult);
preferences.node(md.toString()).node(type.toString()).putInt(“size”,size);
}
公共市场方向getMd(){
返回md;
}
公共UserOfferType getType(){
返回类型;
}
公共布尔isTrade(){
退货贸易;
}
公共int getPlast(){
返塑;
}
公共双getCap(){
回流盖;
}
公共双getMult(){
返回mult;
}
公共int getSize(){
返回大小;
}
公共交易(布尔交易){
这个。贸易=贸易;
}
公共空间设置程序(内部程序){
this.plast=plast;
}
公共无效设置上限(do)
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;
}