2013-05-25 59 views
0

有一個非常類似的問題,但我的情況有點不同。我正在使用屬性和可觀察列表來更改它,它不會更新。 原始問題是hereJavaFX行不更新

所以,當我在表之間轉移的行,像這樣:

Row transferring

第一行會出現,但是當添加一個以上的會導致那些後的第一行不更新,像這樣的:

Row transferring with the bug

他們只當我列走動,雖然再次出現。

爲AddRemoveButtons
//Loot identification 
    TableColumn lootIdentCol = new TableColumn<>("Identification"); 

    TableColumn<ItemDef, Integer> lootIDCol = new TableColumn<>("ID"); 
    lootIDCol.setCellValueFactory(
      new PropertyValueFactory<ItemDef, Integer>("id")); 

    TableColumn<ItemDef, String> lootNameCol = new TableColumn<>("Name"); 
    lootNameCol.setCellValueFactory(
      new PropertyValueFactory<ItemDef, String>("name")); 

    lootIdentCol.getColumns().addAll(lootNameCol, lootIDCol); 

    //Loot price 
    TableColumn<ItemDef, Integer> lootPriceCol = new TableColumn<>("Price"); 
    lootPriceCol.setCellValueFactory(
      new PropertyValueFactory<ItemDef, Integer>("price")); 

    //To loot items table 
    toLootItemsTableView.getColumns().addAll(lootIdentCol, lootPriceCol); 
    grid.add(toLootItemsTableView, 0, 1); 

    //Lootable items table 
    lootableItemsTableView.getColumns().addAll(lootIdentCol, lootPriceCol); 
    grid.add(lootableItemsTableView, 2, 1); 

    toLootItemsTableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
    lootableItemsTableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
    lootableItemsTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
    toLootItemsTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

    lootableTableList.add(new ItemDef("Ab", 141, false, false)); 
    lootableTableList.add(new ItemDef("Ac", 25, false, false)); 
    lootableTableList.add(new ItemDef("AD", 262, false, false)); 

    AddRemoveButtons<ItemDef> addRemoveLootButtons = new AddRemoveButtons<>(
      lootableTableList, lootableItemsTableView.getSelectionModel(), 
      toLootTableList, toLootItemsTableView.getSelectionModel() 
    ); 

代碼:

private final ObservableList<E> fromList; 
private final ObservableList<E> toList; 

public AddRemoveButtons(final ObservableList<E> fromList, final SelectionModel<E> from, 
         final ObservableList<E> toList, final SelectionModel<E> to) { 
    this.fromList = fromList; 
    this.toList = toList; 

    setAlignment(Pos.CENTER); 
    setPadding(new Insets(5, 5, 5, 5)); 
    setSpacing(15); 

    ObservableList<Node> children = getChildren(); 

    Button moveInto = new Button("Add"); 
    moveInto.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent mouseEvent) { 
      if (from instanceof MultipleSelectionModel) { 
       MultipleSelectionModel<E> multipleFrom = (MultipleSelectionModel<E>) from; 
       ObservableList<Integer> selectedIndices = multipleFrom.getSelectedIndices(); 
       for (int i : selectedIndices) 
        transfer(i, true); 
      } else 
       transfer(from.getSelectedIndex(), true); 
     } 
    }); 

    Button delete = new Button("Del"); 
    delete.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent mouseEvent) { 
      if (to instanceof MultipleSelectionModel) { 
       MultipleSelectionModel<E> multipleFrom = (MultipleSelectionModel<E>) to; 
       ObservableList<Integer> selectedIndices = multipleFrom.getSelectedIndices(); 
       for (int i : selectedIndices) 
        transfer(i, false); 
      } else 
       transfer(to.getSelectedIndex(), false); 
     } 
    }); 

    children.addAll(moveInto, delete); 
} 

private void transfer(int index, boolean forward) { 
    if (forward) 
     toList.add(fromList.remove(index)); 
    else 
     fromList.add(toList.remove(index)); 
} 

ItemDef它實現身份識別,序列化,可比:

private final String name; 
private final int  id; 
private final boolean members; 
private final boolean stackable; 
private  int  price; 

public ItemDef(JSONObject jsonObject) { 
    this(
      (String) jsonObject.get("name"), 
      Integer.parseInt((String) jsonObject.get("id")), 
      Boolean.parseBoolean((String) jsonObject.get("members")), 
      Boolean.parseBoolean((String) jsonObject.get("stackable")) 
    ); 
} 

public ItemDef(String name, int id, boolean members, boolean stackable) { 
    this.name = name; 
    this.id = id; 
    this.members = members; 
    this.stackable = stackable; 
    price = -1; 
} 

public String getName() { 
    return name; 
} 

@Override 
public int getId() { 
    return id; 
} 

public boolean isMembers() { 
    return members; 
} 

public boolean isStackable() { 
    return stackable; 
} 

public int getPrice() { 
    return price != -1 ? price : updatePrice(); 
} 

//Other methods not relevant 
+1

它在[Java 8](https://jdk8.java.net/download.html)中工作嗎?如果沒有,你可能想用[SSCCE](http://sscce.org/)[文件錯誤](https://javafx-jira.kenai.com)(http://sscce.org/) – jewelsea

+0

總體來說,它實際上使情況變得更糟,但是我確實看到兩個項目。但他們仍然是越野車,我甚至無法從左表中選擇一個項目。 我還添加了一些更多的代碼,如果這有助於任何人。如果沒有,我會報告它。 – Muhatashim

回答

2

想通了,爲什麼它一直這樣做。

你只是不能在多個表上引用同一個TableColumn。

0

如果您希望數據在多個表中更新,則不應該在多個表中共享列,而是共享它們之間的數據集而不是列。