如果在FXML中指定了控制器,则无法向TableView添加数据。如果未指定控制器,则无法绑定`onAction`

时间:2017-08-13 17:29:45

标签: javafx tableview mouseevent fxml

我正在学习JavaFX FXML。为了将数据添加到TableView,我将控制器添加到POJO类中的FXMLLoader

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/views/my_view.fxml"));
        fxmlLoader.setController(controller);

        try {
            VBox myView = fxmlLoader.load();    
             controller.getInboxTable().setItems(getMyDisplayedItems());
             //...

FXML文件的根有这个定义:

<VBox fx:id="rootVBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">

因此,我无法在FXML文件中指定控制器。

当我在同一个班级中定义按钮时,我无法指定onMouseClicked因为&#34;没有为顶级元素指定控制器&#34;。

因此,我可以使用数据填充TableView或附加操作处理程序,但不能同时填充两者。将SortedList附加到TableView并在FXML中指定onAction的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

如果您想使用FXML,请尝试在那里管理所有View层的代码。您可以通过fx:controller标记在FXML文件中添加控制器。请查看Oracle Docs上的Creating an Address Book with FXML。下面的大部分代码都来自该教程。 另一件事是使用这种分配控制器的方法应该修复“没有为顶级元素指定的控制器”问题。我添加了一个按钮,导致Table View的数据被洗牌。

因此,假设项目文件夹中名为sample的文件夹中包含所有文件:

Main.java:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;

public class Main extends Application {

  @Override
  public void start(final Stage stage) {
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(Main.class.getResource("/sample/sample.fxml"));
    try {
      Parent root;
      root = fxmlLoader.load();
      Scene scene = new Scene(root);
      stage.setScene(scene);
      stage.show();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

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

sample.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<?import javafx.scene.control.cell.PropertyValueFactory?>
<VBox fx:id="rootVBox"
      xmlns="http://javafx.com/javafx/8"
      xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="sample.Controller">
    <Button text="Shuffle Data" onAction="#shuffleDataButtonClicked"/>
    <TableView fx:id="tableView">
        <columns>
            <TableColumn text="First Name">
                <cellValueFactory><PropertyValueFactory property="firstName" />
                </cellValueFactory>
            </TableColumn>
            <TableColumn text="Last Name">
                <cellValueFactory><PropertyValueFactory property="lastName" />
                </cellValueFactory>
            </TableColumn>
            <TableColumn text="Email Address">
                <cellValueFactory><PropertyValueFactory property="email" />
                </cellValueFactory>
            </TableColumn>
        </columns>
    </TableView>
</VBox>

Controller.java:

package sample;

import javafx.fxml.FXML;
import javafx.scene.control.TableView;
import java.util.Collections;
import java.util.Vector;

public class Controller {
  @FXML
  private TableView<Person> tableView;

  @FXML
  private void initialize() {
    tableView.getItems().addAll(getSomePersonData());
  }

  private Vector<Person> getSomePersonData() {
    Person jacobSmith = new Person("Jacob", "Smith", "jacob.smith@example.com");
    Person isabellaJohnson = new Person("Isabella", "Johnson", "isabella.johnson@example.com");
    Person ethanWilliams = new Person("Ethan", "Williams", "ethan.williams@example.com");
    Person emmaJones = new Person("Emma", "Jones", "emma.jones@example.com");
    Person michaelBrown = new Person("Michael", "Brown", "michael.brown@example.com");

    Vector<Person> people = new Vector<>();

    people.add(jacobSmith);
    people.add(isabellaJohnson);
    people.add(ethanWilliams);
    people.add(emmaJones);
    people.add(michaelBrown);

    return people;
  }

  @FXML
  private void shuffleDataButtonClicked() {
    Collections.shuffle(tableView.getItems());
  }
}

Person.java

package sample;

import javafx.beans.property.SimpleStringProperty;

public class Person {
  private final SimpleStringProperty firstName = new SimpleStringProperty("");
  private final SimpleStringProperty lastName = new SimpleStringProperty("");
  private final SimpleStringProperty email = new SimpleStringProperty("");

  public Person() {
    this("", "", "");
  }

  public Person(String firstName, String lastName, String email) {
    setFirstName(firstName);
    setLastName(lastName);
    setEmail(email);
  }

  public String getFirstName() {
    return firstName.get();
  }

  public void setFirstName(String fName) {
    firstName.set(fName);
  }

  public String getLastName() {
    return lastName.get();
  }

  public void setLastName(String fName) {
    lastName.set(fName);
  }

  public String getEmail() {
    return email.get();
  }

  public void setEmail(String fName) {
    email.set(fName);
  }
}