2016-11-21 9 views
1

このような幅広いトピックで迷惑をおかけして申し訳ありません。 私は1つのリストから別のリストに文字列値を選択するダイアログを作成しています。最初にオプションのリストがあります。 GET/setSourceItemsおよび/ setTargetItemsダイアログが起動時にもリストビューを示しObservableListsJavaFXでListViewをリフレッシュする方法

private ListView<String> sourceListView; 
private ObservableList<String> sourceItems; 
private ListView<String> targetListView; 
private ObservableList<String> targetItems; 

     List<String> options = getSelectedMetaDataList(); 
     setSourceItems(FXCollections.observableArrayList(options)); 
     sourceListView = new ListView(getSourceItems()); 
     setTargetItems(FXCollections.observableArrayList(new ArrayList())); 
     targetListView = new ListView(getTargetItems()); 

ためのゲッターとセッターあります。ソースはオプションで埋められ、ターゲットは空です。 しかし、私はボタンを使用すると、UI上で何も起こりません。 たとえば、すべてのアイテムをソースからターゲットに移動すると、targetItems observableListの項目は表示されますが、UIのtargetListViewの項目は表示されません。

 Button selectAllBtn = new Button(">>"); 
      selectAllBtn.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent event) { 
        if (getSourceItems().size() > 0) { 
         setTargetItems(getSourceItems()); 
         targetListView.refresh(); 
         setSourceItems(null); 
         sourceListView.refresh(); 
         System.out.println("selectAllBtn target: " + getTargetItems().toString()); 
        } 
       } 
      }); 

選択モデルにも間違いがあります。選択された項目を移動しようとすると、項目が強調表示されていても、sourceListView.getSelectionModel()。getSelectedItems()は空です。私はobservableListだけでなく、targetListView.getItems()を使って項目を移動しようとしました。addAll(movingItems); まだUIは変更されていません。

 Button selectOneBtn = new Button(">"); 
      selectOneBtn.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent event) { 
        ObservableList<String> movingItems = sourceListView.getSelectionModel().getSelectedItems(); 
        System.out.println("selectOneBtn: " + sourceListView.getSelectionModel().getSelectedItems().size()); 
        System.out.println("selectOneBtn: " + targetListView.getSelectionModel().getSelectedItems().size()); 
        if (movingItems.size() > 0) { 
        System.out.println("selectOneBtn: " + movingItems.toString()); 
        sourceListView.getSelectionModel().clearSelection(); 
        sourceListView.getItems().removeAll(movingItems); 
        sourceListView.refresh(); 
        targetListView.getItems().addAll(movingItems); 
        targetListView.refresh(); 
        System.out.println("selectOneBtn source: " + getSourceItems().toString()); 
        System.out.println("selectOneBtn target: " + getTargetItems().toString()); 
        } 
       } 
      }); 

ありがとうございます。

+3

あなたは私の友人が単純な作業を複雑にしています。 – Sedrick

+1

セッターとゲッターを取り除き、ListViewとObservableListを意図どおりに使用することをお勧めします。 – Sedrick

+1

少なくとも、セッターを取り除く。 'ObservableList'は一般的に最終的な場合に最も効果的です。それらは変更可能なので、新しいリストを指すように参照を変更する必要はほとんどありません。 –

答えて

0

あなたは根本的に観察リストを変更していますが、新しいリストを使用してリストビューを伝えることはありません:

また
Button selectAllBtn = new Button(">>"); 

selectAllBtn.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent event) { 
     if (getSourceItems().size() > 0) { 
      setTargetItems(getSourceItems()); 

      targetListView.setItems(getTargetItems()); 

      // use an empty list, not null: 
      setSourceItems(FXCollections.observableArrayList()); 

      sourceListView.setItems(getSourceItems()); 

      System.out.println("selectAllBtn target: " + getTargetItems().toString()); 
     } 
    } 
}); 

は、代わりに新しいリストへの変更を、単に既存のリストの内容を変更します。

ObservableList<String> movingItems = sourceListView.getSelectionModel().getSelectedItems(); 

、その後、あなたが選択を解除:あなたが選択した項目のリストへの参照を取得し、あなたの選択の問題については

Button selectAllBtn = new Button(">>"); 

selectAllBtn.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent event) { 
     if (getSourceItems().size() > 0) { 

      getTargetItems().setAll(getSourceItems()); 

      getSourceItems().clear(); 

      System.out.println("selectAllBtn target: " + getTargetItems().toString()); 
     } 
    } 
}); 

:リストが観測されているので、リストビューは自動的に変更が表示されます:

sourceListView.getSelectionModel().clearSelection(); 

これはもちろん、選択した項目のリストを空にします。

あなたは

sourceListView.getItems().removeAll(movingItems); 
targetListView.getItems().addAll(movingItems); 

を行う際だから今、あなたは空のリスト内の各時間を渡している、ので、何も変更されます。

代わりに、選択した項目をコピーします。

List<String> movingItems = new ArrayList<>(sourceListView.getSelectionModel().getSelectedItems()); 

、その後

sourceListView.getItems().removeAll(movingItems); 
targetListView.getItems().addAll(movingItems); 

は、所望の効果(refresh()をコールする必要はありません)があります。私は間違っているあなたの問題を見ているかもしれない

import java.util.ArrayList; 
import java.util.List; 

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class MoveItemsBetweenListViews extends Application { 

    private ObservableList<String> sourceItems; 
    private ObservableList<String> targetItems; 



    @Override 
    public void start(Stage primaryStage) { 
     sourceItems = FXCollections.observableArrayList("One", "Two", "Three", "Four"); 
     targetItems = FXCollections.observableArrayList(); 

     ListView<String> sourceListView = new ListView<>(sourceItems); 
     ListView<String> targetListView = new ListView<>(targetItems); 

     Button moveAllButton = new Button(">>"); 
     Button moveSelectedButton = new Button(">"); 

     moveAllButton.setOnAction(e -> moveItems(sourceItems)); 
     moveSelectedButton.setOnAction(e -> moveItems(sourceListView.getSelectionModel().getSelectedItems())); 

     VBox buttons = new VBox(10, moveAllButton, moveSelectedButton); 
     buttons.setAlignment(Pos.CENTER); 

     BorderPane root = new BorderPane(buttons, null, targetListView, null, sourceListView); 
     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void moveItems(List<String> itemsToMove) { 
     List<String> movingItems = new ArrayList<>(itemsToMove); 
     sourceItems.removeAll(movingItems); 
     targetItems.addAll(movingItems); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

こんにちは。あなたの答えをありがとう。 私はリフレッシュについて両方の提案を試みましたが、何も変わりません。 sourceItemsとtargetItemsはObservableList として定義されています。私は正しいタイプsi ObservableListArrayのどこかを読んでいます。 –

+0

@EduardNickelいいえ、「ObservableList 」は正しいです。まだ動作していない場合は、投稿していないコードで何か間違っています。 update SSCCEを含むupdateを参照してください。 –

+0

ありがとうございます。 SSCCEは素晴らしく、うまく動作します。このような単純な行動に何が影響するのでしょうか?私が書いたように、私のボタンはダイアログにあります。たぶん、この影響プロセス全体:( –

0

が、私には、それはあなたのように思える:ここ

はSSCCE(彼らは基本的に同じなので、私は一つの方法に、両方の行動を統一注意してください)です簡単な作業が複雑になりました。 ListViewとObservableListは単純で、ListViewの更新/更新を簡単にするように設計されています。私はあなたのgetSelectedMetaDataList()メソッドがArrayListを返すようにする必要があると思います。そしてObservableListを作成してArrayListでプライミングする必要があります。次に、それに応じてObservableListとListViewを使用する必要があります。そこからObservableListメソッドを使用して、実行しようとしていることを達成する必要があります。

 ArrayList<String> options = getSelectedMetaDataList();//Make this method return an ArrayList 
     ObservableList<String> items = FXCollections.observableArrayList(options); 
     ListView targetListView = new ListView(); 
     targetListView.setItems(items); 
+0

ありがとうございます。私はnewbeeが試すことができるほど試してみました:) 私のために ObservableList items = FXCollections.observableArrayList(リスト); は と同じObservableList items = FXCollections.observableArrayList(ArrayList ); OutocomeはObservableListです;) –

+0

setSourceItems(FXCollections.observableArrayList(options));私はこれが悪い考えだと思う。主にこのFXCollections.observableArrayList(オプション)。定義されたobserableArraylistはありません。これはあなたがなぜ問題があるのか​​私の推測です。 – Sedrick

+0

sourceItemsとtargetItemsはObservableListです getterとsetterを削除しました。 メソッドgetSelectedMetaDataList()を変更して、ArrayList を返すようになりましたが、まだ成功していません。 :( –

0

私はこのようなことをやろうとしています。

@FXML ListView lv1, lv2; 

ArrayList options = new ArrayList(); 
ObservableList<String> items; 

ObservableList<String> items2; 


//This is used to get the selected item from lv1 and add it to lv2 
@FXML 
private void handleButtonAction(ActionEvent event) { 
    items2.add(lv1.getSelectionModel().getSelectedItem().toString());    
} 

//This is used to get all items from lv1 and add them to lv2 
@FXML 
private void handleGetAllButtonAction(ActionEvent event) 
{ 
    for(String entry : items) 
    { 
     items2.add(entry); 
    } 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 

    options.add("hello"); 
    options.add("bye"); 
    options.add("hola"); 
    items = FXCollections.observableArrayList(options); 
    items2 = FXCollections.observableArrayList(); 

    System.out.println(items.size()); 
    lv1.setItems(items); 
    lv2.setItems(items2); 

}  
+0

@Eduardそれはどのように行ったのですが? – Sedrick

関連する問題