2017-08-02 128 views
0

我有一个场景,我可以创建一个数据,现在我想把它放到我的TableView“TV_currency”中。JavaFX - 场景 - 在另一个场景中修改变量

但是这个人已经进入另一个已经开放的场景,我不想关闭并重新打开这个场景。

你可以看看它吗?

ControllerOptions.java(TV_currency是这里):

public class ControllerOptions implements Initializable{ 
//VARIABLES  
@FXML private TableView<Currency> TV_currency; 
@FXML private TableColumn<Currency, String> TC_name; 
@FXML private TableColumn<Currency, Double> TC_value; 

private ObservableList<Currency> currencies = FXCollections.observableArrayList(); 

//FUNCTIONS 
@Override 
public void initialize(URL location, ResourceBundle rb){ 
    //initialisation Table Currencies 
    for (Currency currency : Datas.getInstance().getCurrencies()) { 
     currencies.add(currency); 
    }  
    TC_name.setCellValueFactory(new PropertyValueFactory<Currency, String>("name")); 
    TC_value.setCellValueFactory(new PropertyValueFactory<Currency, Double>("value")); 
    TV_currency.setItems(currencies); //TODO Corriger setItems() de la TableView 
} 

@FXML void add_currency(MouseEvent event) throws IOException { 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("options/currency_add.fxml")); 
    Parent root1 = (Parent) fxmlLoader.load(); 
    Stage stage = new Stage(); 
    stage.initModality(Modality.APPLICATION_MODAL); 
    stage.initStyle(StageStyle.UNDECORATED); 
    stage.setTitle("Add new currency"); 
    stage.setScene(new Scene(root1)); 
    stage.setFullScreen(true); 
    stage.show(); 
} 

@FXML void open_options(ActionEvent event) throws IOException { 
    Group actor = new Group(); 
    actor.getChildren().add(FXMLLoader.load(getClass().getResource("options.fxml"))); 
    com.courieux.wheresmymoney.Main.setScene(actor, "Where's My Money"); 
} 
} 

ControllerCurrencyAdd.java(在这里我想编辑TV_currency):

public class ControllerCurrencyAdd { 

@FXML private TextField TF_name; 
@FXML private TextField TF_value; 
@FXML private TextField TF_acronym; 

@FXML 
void add(ActionEvent event) { 
    Currency currency = new Currency(TF_name.getText(), Double.valueOf(TF_value.getText())); 
    Datas.getInstance().addCurrency(currency); 

    //==> HERE I NEED TO EDIT VARIABLES BELOW <== 
    //currencies.setAll(Datas.getInstance().getCurrencies()); 
    //TV_currency.setItems(currencies); 
} 
} 

Datas.java:

public class Datas { 

//SINGLETON PATTERN 
private Datas() {} 
private static Datas INSTANCE = new Datas();  
public static Datas getInstance(){ 
    return INSTANCE; 
} 
//END SINGLETON PATTERN 

//VARS 
private List<Currency> currencies = new ArrayList<>(); 

//FUNCTIONS - Add/Edit/Delete 
public void addCurrency(Currency currency){ 
    currencies.add(currency); 
} 

//FUNCTIONS - getter/setters 
public List<Currency> getCurrencies() { 
    return currencies; 
} 
public void setCurrencies(List<Currency> currencies) { 
    this.currencies = currencies; 
} 
} 

Currency.java:

public class Currency { 

//VARS 
private  String  name; 
private  double  value; 

//FUNCTIONS - constructors 
public Currency(String name, double value) { 
    setName(name); 
    setValue(value); 
} 

//FUNCTIONS 
public boolean equals(Currency currency){ 
    if(this.name == currency.getName() 
      && this.value == currency.getValue()){ 
     return true; 
    } else { 
     return false; 
    } 
} 

//FUNCTIONS - getters/setters 
public void setName(String name) { 
    this.name = name; 
} 
public String getName() { 
    return name; 
} 
public void setValue(double value) { 
    this.value = value; 
} 
public double getValue() { 
    return value; 
} 
} 

然后我想将新数据放入ObservableList“货币”并设置TV_currency。

在此先感谢!

+0

您需要创建一个[最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。 – Sedrick

+0

我会尽力完成它 –

+0

将数据存储在一个单独的类中(在设计模式术语中称为“模型”),并与控制器共享该类的一个实例(这实质上是MVC设计模式背后的想法)。以https://stackoverflow.com/questions/32342864/applying-mvc-with-javafx为例。在这里,如果你让你的单例'Datas'返回一个'ObservableList',你可以在一个控制器中做'TV_currency.setItems(Datas.getInstance()。getCurrencies())',然后'Datas.getInstance()。addCurrency (...)'应该自动更新表格。 –

回答

0

您可以对代码进行的最简单的更改是让您的单例类保留ObservableList而不是List。然后,您可以直接在表格视图中使用它,并直接在其他控制器中更新它。由于表格视图观察其支持列表,所以可观察列表的更改将立即反映在表格中。

I.e.

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

public class Datas { 

    // SINGLETON PATTERN 
    private Datas() { 
    } 

    private static Datas INSTANCE = new Datas(); 

    public static Datas getInstance() { 
     return INSTANCE; 
    } 
    // END SINGLETON PATTERN 

    // VARS 
    private ObservableList<Currency> currencies = FXCollections.observableArrayList(); 

    // FUNCTIONS - Add/Edit/Delete 
    public void addCurrency(Currency currency) { 
     currencies.add(currency); 
    } 

    // FUNCTIONS - getter/setters 
    public ObservableList<Currency> getCurrencies() { 
     return currencies; 
    } 

} 

然后

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Group; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.input.MouseEvent; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class ControllerOptions implements Initializable { 
    // VARIABLES 
    @FXML 
    private TableView<Currency> TV_currency; 
    @FXML 
    private TableColumn<Currency, String> TC_name; 
    @FXML 
    private TableColumn<Currency, Double> TC_value; 

    private ObservableList<Currency> currencies = FXCollections.observableArrayList(); 

    // FUNCTIONS 
    @Override 
    public void initialize(URL location, ResourceBundle rb) { 
     // initialisation Table Currencies 

     TC_name.setCellValueFactory(new PropertyValueFactory<Currency, String>("name")); 
     TC_value.setCellValueFactory(new PropertyValueFactory<Currency, Double>("value")); 

     // Note how the list from Datas is used directly in the table: 
     TV_currency.setItems(Datas.getInstance().getCurrencies()); 
    } 

    @FXML 
    void add_currency(MouseEvent event) throws IOException { 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("options/currency_add.fxml")); 
     Parent root1 = (Parent) fxmlLoader.load(); 
     Stage stage = new Stage(); 
     stage.initModality(Modality.APPLICATION_MODAL); 
     stage.initStyle(StageStyle.UNDECORATED); 
     stage.setTitle("Add new currency"); 
     stage.setScene(new Scene(root1)); 
     stage.setFullScreen(true); 
     stage.show(); 
    } 

    @FXML 
    void open_options(ActionEvent event) throws IOException { 
     Group actor = new Group(); 
     actor.getChildren().add(FXMLLoader.load(getClass().getResource("options.fxml"))); 
     Main.setScene(actor, "Where's My Money"); 
    } 
} 

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.control.TextField; 

public class ControllerCurrencyAdd { 

    @FXML 
    private TextField TF_name; 
    @FXML 
    private TextField TF_value; 
    @FXML 
    private TextField TF_acronym; 

    @FXML 
    void add(ActionEvent event) { 
     Currency currency = new Currency(TF_name.getText(), Double.valueOf(TF_value.getText())); 

     // since we update the list used as the table's backing list, the table will automatically update: 
     Datas.getInstance().addCurrency(currency); 

    } 
} 

Datas类被认为是一种 “模式” 中的MVC(以及相关的)的设计模式。通常将这个单例作为一个单例可以稍后修改应用程序(许多程序员认为这是一种反模式)。您可能会考虑将其作为常规类,并使用依赖注入技术为每个控制器访问相同的实例。

+0

这是完美的工作! –