当前位置: 首页 > 知识库问答 >
问题:

JavaFX从模态窗口窗体填充主屏幕上的TableView

莫飞翮
2023-03-14

我试图通过单击模式窗口中的按钮来调用方法,从而填充TableView。我希望这是可能的,但是我运气不好。已经在FXML文件中创建了TableView。每当我调用该方法时,都会收到一个空指针异常。有什么想法或建议吗?抱歉,如果我的问题格式不好,我问的问题不多。

主控制器.java

@FXML TableView<Part> partsTableView;
@FXML ObservableList<Part> parts;
@FXML public TableColumn<Part, Integer> partIDColumn;
@FXML public TableColumn<Part, String> partNameColumn;
@FXML public TableColumn<Part, Integer> partILColumn;
@FXML public TableColumn<Part, Double> partPriceColumn;

    @FXML
    public void getPartData(){
      partIDColumn.setCellValueFactory(new PropertyValueFactory<>("id")); (Line 112)
      partNameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
      partILColumn.setCellValueFactory(new PropertyValueFactory<>("instock"));
      partPriceColumn.setCellValueFactory(new PropertyValueFactory<>("price"));
      partsTableView.setItems(generateData());
    }

    private ObservableList<Part> generateData(){
      parts = FXCollections.observableArrayList();
      parts.add(new Part(0, "Part" , 1 , 25.00));

     return parts;
    }

main.fxml

    <TableView fx:id="partsTableView" layoutX="13.0" layoutY="68.0" prefHeight="344.0" prefWidth="556.0">
      <columns>
        <TableColumn fx:id="partIDColumn" editable="false" prefWidth="138.0" resizable="false" text="Part ID" />
        <TableColumn fx:id="partNameColumn" editable="false" prefWidth="139.0" resizable="false" text="Part Name" />
        <TableColumn fx:id="partILColumn" editable="false" prefWidth="119.0" resizable="false" text="Inventory Level" />
        <TableColumn fx:id="partPriceColumn" editable="false" prefWidth="159.0" resizable="false" text="Price / Cost Per Unit" />
      </columns>
    </TableView>

错误:原因:java.lang.ims.MainController.get部分数据的NullPointer异常(MainController.java:112)

我正在使用IntelliJ,我在Scene Builder中构建我的舞台/场景。如果这真的很简单,我忽略了一些东西,我很抱歉,但是,我只是很难弄清楚这一点。

提前感谢您的时间和帮助!

共有1个答案

阮星火
2023-03-14

我已经准备了一个样本。你可以按照它的逻辑。要点是管理主对话框和模态Dilog控制器。您可以检查Dialog计数器dialog计数器=fxmlLoader。

AppMain.java:

package populatetable;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class AppMain extends Application{

    @Override
    public void start(Stage primaryStage) throws Exception {

        Parent root = FXMLLoader.load(getClass().getResource("AppMain.fxml"));
        Scene scene = new Scene(root, 500,500);
        primaryStage.setScene(scene);
        primaryStage.show();

    }


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

}

AppMain.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane minHeight="500.0" minWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="populatetable.AppMainController">
   <children>
      <TableView fx:id="tvData" layoutX="91.0" layoutY="159.0" prefHeight="300.0" prefWidth="300.0">
        <columns>
          <TableColumn fx:id="colId" prefWidth="75.0" text="ID" />
          <TableColumn fx:id="colName" prefWidth="75.0" text="Name" />
        </columns>
         <columnResizePolicy>
            <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
         </columnResizePolicy>
      </TableView>
      <Button layoutX="211.0" layoutY="85.0" mnemonicParsing="false" onAction="#onOpenDialog" text="Open Dialog" />
   </children>
</AnchorPane>

应用主控制器.java

package populatetable;
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.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

public class AppMainController implements Initializable {

    @FXML
    private TableView<Data> tvData;

    @FXML
    private TableColumn colId;

    @FXML
    private TableColumn colName;

    private ObservableList<Data> tvObservableList = FXCollections.observableArrayList();

    // Open dialog button click event
    @FXML
    void onOpenDialog(ActionEvent event) throws IOException {
        System.out.println("onOpenDialog clicked");

        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Dialog.fxml"));
        Parent parent = fxmlLoader.load();
        DialogController dialogController = fxmlLoader.<DialogController>getController();
        dialogController.setAppMainObservableList(tvObservableList);
        Scene scene = new Scene(parent, 300, 200);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();

    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        colId.setCellValueFactory(new PropertyValueFactory<>("id"));
        colName.setCellValueFactory(new PropertyValueFactory<>("name"));
        tvData.setItems(tvObservableList);

    }

    public ObservableList<Data> getTvObservableList() {
        return tvObservableList;
    }


}

DialogController.java

package populatetable;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;

public class DialogController  {


    private ObservableList<Data> appMainObservableList;

    //fill table button click event
    @FXML
    void fillTable(ActionEvent event) {

        Data data = new Data(1, "Name1");
        appMainObservableList.add(data);

    }

    public void setAppMainObservableList(ObservableList<Data> tvObservableList) {
        this.appMainObservableList = tvObservableList;

    }

}

对话框.xml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane minHeight="200.0" minWidth="300.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111" fx:controller="populatetable.DialogController">
   <children>
      <Button layoutX="115.0" layoutY="89.0" mnemonicParsing="false" onAction="#fillTable" text="Fill Table" />
   </children>
</AnchorPane>

数据.java

package populatetable;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;

public class Data {

    private final SimpleIntegerProperty id;
    private final SimpleStringProperty name;


    public Data(int id, String name) {
        this.id = new SimpleIntegerProperty(id);
        this.name = new SimpleStringProperty(name);
    }

    public int getId() {
        return id.get();
    }

    public void setId(int ID) {
        id.set(ID);
    }

    public String getName() {
        return name.get();
    }

    public void setName(String nme) {
        name.set(nme);
    }

    @Override
    public String toString() {
        return "id: " + id.get() + " - " + "name: " + name.get();
    }

}

希望它有用。

 类似资料:
  • 在这节中,我们用GtkBuilder 模板结合一个GtkBuilder ui 文件和我们的应用程序窗口类。 我们简单的ui 文件把GtkHeaderBar 放在GtkStack 部件顶端。头栏包括一个显示GtkStack 页面分页的一行的独立部件——GtkStackSwitcher。 <?xml version="1.0" encoding="UTF-8"?> <interface> <!--

  • 问题内容: 我正在尝试使用JavaFX 2创建登录窗口并停止执行,直到用户未登录为止。我想要以下内容: 负责创建一个新舞台并将其父级设置为主窗口。它将阶段设置为模态,我尝试了和,但是一旦显示登录窗口,该行也会被调用。 是否可以停止运行代码,直到调用登录阶段的,或类似的操作?是否有任何教程显示如何实现? 问题答案: 正如乌鲁克所说,有一个JIRA问题。该问题已在JavaFX 2.2 beta版中得到

  • 给对话框,确认信息框,或者其他内容使用模态时可以调用。为了使模态工作,你需要给模态一个 Id 来关联触发器。增加一个关闭按钮,只要增加类 .modal-close 到你的关闭按钮上。 模态的 HTML 结构 <!-- Modal Trigger --> <a class="waves-effect waves-light btn" href="#modal1">模态</a> <!-- Modal

  • main.java--(src/sample文件夹) studentcontroller.java--(src/sample/controller文件夹) studentdao.java和sexdao.java(数据访问对象)--(src/sample/model文件夹) Student.java(公共类学生和构造器)--(src/sample/model文件夹) oddbc的util下的dbut

  • 我正在尝试使用JavaFX 2创建一个登录窗口并停止执行,直到用户尚未登录。我想要类似下面的东西: 负责创建一个新阶段,并将其父级设置为主窗口。它将舞台设置为模态,我尝试了和,但是一旦显示登录窗口,也会调用行。 有没有可能在登录阶段的< code>close()被调用之前停止代码运行,或者类似的事情?有没有教程展示如何做到这一点?

  • 主要内容:$ionicModal,ionicModal,实例$ionicModal $ionicModal 可以遮住用户主界面的内容框。 你可以在你的 index 文件或者是其他文件内嵌入以下代码(里面的代码可以根据你自己的业务场景相应的改变)。 然后你就可以在你的 Controller 里面的注入 $ionicModal 。然后调用你刚刚写入的模板,进行初始化操作。就像下面的代码: 方法 参数 类型 详情 templateString 模板的字符串作为模