2016-07-15 4 views
0

Я новичок в этом материале java/javafx, и я был бы очень доволен, если бы кто-нибудь мог мне помочь.JavaFX - переместить элемент ListView - MVC

У меня есть следующий код:

// Main.java

package lernen; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class Main extends Application 
{ 
    @Override 
    public void start(Stage primaryStage) 
    { 
     Presenter p = new Presenter(); 
     View v = new View(p); 
     Model m = new Model(); 

     p.setModel(m); 
     p.setView(v); 

     Scene scene = new Scene(v.getUI()); 
     primaryStage.setTitle("Schiebefenster"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

// View.java

package lernen; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.GridPane; 

public class View 
{ 
    private Presenter presenter; 

    private GridPane pane; 

    private Button b1, b2; 

    private Label l1, l2; 

    // private ObservableList<String> candidates = FXCollections.observableArrayList("a", "b", "c", "d"); 
    private ObservableList<String> candidates = FXCollections.observableArrayList(); 

    private ListView<String> list = new ListView<>(candidates); 

    private ObservableList<String> selected = FXCollections.observableArrayList(); 

    private ListView<String> list2 = new ListView<>(selected); 

    public View(Presenter presenter) 
    { 
     this.presenter = presenter; 
     initView(); 
    } 

    private void initView() 
    { 
     pane = new GridPane(); 
     pane.setVisible(true); 
     l1 = new Label("Buchstabe"); 
     pane.add(l1, 0, 0); 
     l2 = new Label("Selektiert"); 
     pane.add(l2, 4, 0); 
     b1 = new Button("<"); 
     pane.add(b1, 2, 2); 
     b2 = new Button(">"); 
     pane.add(b2, 2, 3); 
     // list = new ListView<String>(); 
     pane.add(list, 0, 1, 2, 5); 
     // list2 = new ListView<>(); 
     pane.add(list2, 4, 1, 2, 5); 


     b2.setOnAction((ActionEvent) -> { 
      String potential = list.getSelectionModel().getSelectedItem(); 
      if (potential != null) 
      { 
       list.getSelectionModel().clearSelection(); 
       candidates.remove(potential); 
       selected.add(potential); 
      } 
     }); 

     b1.setOnAction((ActionEvent) -> { 
      String selectedItem = list2.getSelectionModel().getSelectedItem(); 
      if (selectedItem != null) 
      { 
       list2.getSelectionModel().clearSelection(); 
       selected.remove(selectedItem); 
       candidates.add(selectedItem); 
      } 
     }); 

    } 

    public GridPane getUI() 
    { 
     return pane; 
    } 

    public ListView<String> getList() 
    { 
     return list; 
    } 

    public ListView<String> getList2() 
    { 
     return list2; 
    } 

} 

// Presenter.java

package lernen; 

public class Presenter 
{ 
    private View view; 

    private Model model; 

    public Presenter() 
    { 
    } 

    public void setView(View view) 
    { 
     this.view = view; 
     this.view.getList().setItems(model.getData()); 
    } 

    public void setModel(Model model) 
    { 
     this.model = model; 
    } 

} 

// Model.java

package lernen; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

public class Model 
{ 
    private ObservableList<String> data = FXCollections.observableArrayList(); 

    public Model() 
    { 
     data.addAll("a", "b", "c", "d", "e"); 
    } 

    public ObservableList<String> getData() 
    { 
     return data; 
    } 

} 

Задача состоит в перемещении элемента из левого списка вправо и наоборот в соответствии с шаблоном MVP. Проблема в том, что если я переместил одну букву в правую сторону, буква на левой стороне все еще там. Надеюсь, вы, ребята, можете мне помочь. Спасибо заранее!

ответ

1

В предъявитель вы звоните

this.view.getList().setItems(model.getData()); 

поэтому список будет отображать элементы, определенные в ObservableList модели, поэтому, когда в обработчик события b2 вы звоните

candidates.remove(potential); 

вас на самом деле попытайтесь удалить элемент из другого списка (который фактически пуст).

Я предполагаю, что путаница происходит из следующих действий:

Вы определили ObservableList, и вы назначили этот список, чтобы служить в качестве модели данных вашего ListView.

private ObservableList<String> candidates = FXCollections.observableArrayList(); 
private ListView<String> list = new ListView<>(candidates); 

, а затем, когда в контроллере вы назвали

this.view.getList().setItems(model.getData()); 

вы думали, что это будет заполнить candidatesObservableList с элементами ObservableList, хранящихся в модели (все из них элементов из списка в модели будут скопированы в этот список). Но когда вы вызываете setItems, вы устанавливаете ссылку, хранящуюся в itemsProperty, указывается ObservableList, поэтому она будет указывать на ObservableList, хранящуюся в модели, и не больше candidates.

Вы можете изменить эту строку:

this.view.getList().getItems().addAll(model.getData()); 

Разница заключается в том, что в этом случае getItems() вернет ObservableList хранящиеся в itemsProperty, а затем все элементы копируются из модели в этот список, но он все равно укажет на candidates. В этом случае ObservableList в модели не тронут.

Или же вы можете изменить слушателей, как:

view.getList2().getItems().remove(selectedItem); 

который удалит элемент из ObservableList в модели также.

Ситуация в основном такая же, как здесь: Why does JavaFX table.getItems().clear() clear the ObservableList as well

+0

Большое спасибо за вашу помощь. Я решил проблему, используя другой подход пару минут назад. но решение youre работает! *пальцы вверх* – manCRO

0

// presenter.java

package lernen; 

public class Presenter 
{ 
    private View view; 

    private Model model; 

    public Presenter() 
    { 
    } 

    public void setView(View view) 
    { 
     this.view = view; 
     this.view.getList().setItems(model.getData()); 
    } 

    public void setModel(Model model) 
    { 
     this.model = model; 
    } 

    public void RightToLeft() { 
     System.out.println("RightToLeft triggered."); 
     String selectedItem = view.getList2().getSelectionModel().getSelectedItem(); 
     if (selectedItem != null) 
     { 
      view.getList2().getSelectionModel().clearSelection(); 
      view.getList2().getItems().remove(selectedItem); 
      view.getList().getItems().add(selectedItem); 
     } 
    } 

    public void LeftToRight() { 
     System.out.println("LeftToRight triggered."); 
     String selectedItem = view.getList().getSelectionModel().getSelectedItem(); 
     if (selectedItem != null) 
     { 
      view.getList().getSelectionModel().clearSelection(); 
      view.getList().getItems().remove(selectedItem); 
      view.getList2().getItems().add(selectedItem); 
     } 
    } 

} 

// view.java

package lernen; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.GridPane; 

public class View 
{ 
    private Presenter presenter; 

    private GridPane pane; 

    private Button b1, b2; 

    private Label l1, l2; 

    private ObservableList<String> candidates = FXCollections.observableArrayList(); 

    private ListView<String> list = new ListView<>(candidates); 

    private ObservableList<String> selected = FXCollections.observableArrayList(); 

    private ListView<String> list2 = new ListView<>(selected); 

    public View(Presenter presenter) 
    { 
     this.presenter = presenter; 
     initView(); 
    } 

    private void initView() 
    { 
     pane = new GridPane(); 
     pane.setVisible(true); 
     l1 = new Label("Buchstabe"); 
     pane.add(l1, 0, 0); 
     l2 = new Label("Selektiert"); 
     pane.add(l2, 4, 0); 
     b1 = new Button("<"); 
     pane.add(b1, 2, 2); 
     b2 = new Button(">"); 
     pane.add(b2, 2, 3); 
     list = new ListView<String>(); 
     pane.add(list, 0, 1, 2, 5); 
     list2 = new ListView<>(); 
     pane.add(list2, 4, 1, 2, 5); 

     b1.setOnAction(e -> presenter.RightToLeft()); 
     b2.setOnAction(e -> presenter.LeftToRight()); 
    } 

    public GridPane getUI() 
    { 
     return pane; 
    } 

    public ListView<String> getList() 
    { 
     return list; 
    } 

    public ListView<String> getList2() 
    { 
     return list2; 
    } 

} 

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

  • Нет связанных вопросов^_^