鱼C论坛

 找回密码
 立即注册
查看: 813|回复: 19

[已解决]jawa scene builder 和 tableview 不会设置控制器

[复制链接]
发表于 2023-7-5 15:43:00 | 显示全部楼层 |阅读模式
60鱼币
本帖最后由 wow7jiao 于 2023-7-7 18:42 编辑

就差一点点,表里不出数据,我不知道怎么设置控制器MainController ,应该是scene里面设置或者样表改,请前辈解决
package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Pane root = (Pane) FXMLLoader.load(getClass().getResource("Sample.fxml"));
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.beans.property.*;

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

public class MainController implements Initializable {
    @FXML
    private TableView<Person> table;
    @FXML
    private TableColumn<Person, Integer> ageCol;
    @FXML
    private TableColumn<Person, String> nameCol;

    // 创建并初始化数据
    private final ObservableList<Person> cellData = FXCollections.observableArrayList();

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        cellData.add(new Person(20,"Jack"));
        cellData.add(new Person(18,"Jerry"));
        cellData.add(new Person(21,"Mike"));

        // 配置 TableColumn 列
        ageCol.setCellValueFactory(cellData -> cellData.getValue().getAge().asObject());
        nameCol.setCellValueFactory(cellData -> cellData.getValue().getName());

        // 为 TableView 添加数据
        table.setItems(cellData);
    }

    public class Person {
        private IntegerProperty age;
        private StringProperty name;

        public Person(Integer age, String name) {
            super();
            this.age = new SimpleIntegerProperty(age);
            this.name = new SimpleStringProperty(name);
        }

        public IntegerProperty getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = new SimpleIntegerProperty(age);
        }

        public StringProperty getName() {
            return name;
        }

        public void setName(String name) {
            this.name = new SimpleStringProperty(name);
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>


<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
   <center>
      <TableView fx:id="table" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
        <columns>
          <TableColumn fx:id="ageCol" prefWidth="75.0" text="C1" />
          <TableColumn fx:id="nameCol" prefWidth="75.0" text="C2" />
        </columns>
      </TableView>
   </center>
</BorderPane>


最佳答案
2023-7-5 15:43:01
wow7jiao 发表于 2023-7-7 17:25
用了,运行不了,你少写一部分,MainController.java 没有实例化

根据报错信息,错误的原因是找不到"MainController"类。请确保在`Sample.fxml`文件中正确指定了`controller`属性,并且`MainController`类位于`application`包中。

具体来说,你需要在`Sample.fxml`文件中添加一个`fx:controller`属性,指向`MainController`类的完全限定名,例如:
<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="application.MainController">
   ...
</BorderPane>

这样,FXML加载器才能正确地将`Sample.fxml`与`MainController`关联起来。

test.zip

7.6 KB, 下载次数: 1

完整附件

test.zip

7.26 KB, 下载次数: 4

可运行

最佳答案

查看完整内容

根据报错信息,错误的原因是找不到"MainController"类。请确保在`Sample.fxml`文件中正确指定了`controller`属性,并且`MainController`类位于`application`包中。 具体来说,你需要在`Sample.fxml`文件中添加一个`fx:controller`属性,指向`MainController`类的完全限定名,例如: 这样,FXML加载器才能正确地将`Sample.fxml`与`MainController`关联起来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 15:43:01 | 显示全部楼层    本楼为最佳答案   
wow7jiao 发表于 2023-7-7 17:25
用了,运行不了,你少写一部分,MainController.java 没有实例化

根据报错信息,错误的原因是找不到"MainController"类。请确保在`Sample.fxml`文件中正确指定了`controller`属性,并且`MainController`类位于`application`包中。

具体来说,你需要在`Sample.fxml`文件中添加一个`fx:controller`属性,指向`MainController`类的完全限定名,例如:
<BorderPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="application.MainController">
   ...
</BorderPane>

这样,FXML加载器才能正确地将`Sample.fxml`与`MainController`关联起来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 15:43:15 | 显示全部楼层
关于JavaFX中的Scene Builder和TableView的控制器设置问题,您可以按照以下步骤进行操作:

1. 首先,打开Scene Builder并加载FXML文件(Sample.fxml)。
2. 在Scene Builder中,选择TableView,并在右侧的"Code"选项卡中编辑器区域中选择控制器类(MainController)。
3. 在控制器类(MainController)中,使用@FXML注释标记TableView和TableColumn字段,以便可以在FXML文件中引用它们。

java   @FXML   private TableView<Person> table;      @FXML   private TableColumn<Person, Integer> ageCol;      @FXML   private TableColumn<Person, String> nameCol;   
4. 在FXML文件中,为TableView和TableColumn设置FXID,以便与控制器类中的字段进行关联。

xml   <TableView fx:id="table" ...>       <columns>           <TableColumn fx:id="ageCol" ... />           <TableColumn fx:id="nameCol" ... />       </columns>   </TableView>   
5. 在控制器类(MainController)的initialize方法中,通过调用setCellValueFactory方法为TableColumn设置数据值工厂。您可以使用Lambda表达式来简化代码。

java   @Override   public void initialize(URL url, ResourceBundle rb) {       // ...       ageCol.setCellValueFactory(cellData -> cellData.getValue().getAge().asObject());       nameCol.setCellValueFactory(cellData -> cellData.getValue().getName());       // ...   }   
6. 最后,在控制器类(MainController)的initialize方法中,将数据(cellData)设置到TableView中。

java   @Override   public void initialize(URL url, ResourceBundle rb) {       // ...       table.setItems(cellData);       // ...   }   
通过以上步骤,您可以使用Scene Builder和控制器类(MainController)来设置TableView和TableColumn的相关属性,并将数据显示在TableView中。请确保FXML文件与控制器类中的字段、FXID和方法名称正确匹配。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 17:01:48 | 显示全部楼层
试试这个
MainApp.java:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MainApp extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
        primaryStage.setScene(new Scene(loader.load()));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
MainController.java:
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;

public class MainController {

    @FXML
    private TableView<Person> table;
    @FXML
    private TableColumn<Person, String> nameCol;
    @FXML
    private TableColumn<Person, Integer> ageCol;

    private ObservableList<Person> cellData = FXCollections.observableArrayList();

    public void initialize() {
        // 初始化数据
        loadData();

        // 配置列的CellValueFactory
        nameCol.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
        ageCol.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());

        // 将数据设置到表格中
        table.setItems(cellData);
    }

    private void loadData() {
        // 添加示例数据
        cellData.add(new Person("Alice", 25));
        cellData.add(new Person("Bob", 30));
        cellData.add(new Person("Charlie", 35));
    }
}

Person.java:
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;

public class Person {
    private SimpleStringProperty name;
    private SimpleIntegerProperty age;

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

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

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public int getAge() {
        return age.get();
    }

    public SimpleIntegerProperty ageProperty() {
        return age;
    }
}

Sample.fxml:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainController">
    <center>
        <TableView fx:id="table">
            <columns>
                <TableColumn fx:id="nameCol" text="Name" prefWidth="100" />
                <TableColumn fx:id="ageCol" text="Age" prefWidth="50" />
            </columns>
        </TableView>
    </center>
</BorderPane>
这是一个简单的示例,演示了如何在TableView中显示数据。你可以根据需要进行修改和扩展。

请注意,为了使代码完整运行,你需要在同级目录下创建一个名为"MainApp.fxml"的FXML文件,并将上面所提供的Sample.fxml内容复制到其中。

希望这能帮到你!如果你有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-5 17:19:25 | 显示全部楼层
sfqxx 发表于 2023-7-5 17:01
试试这个
MainApp.java:

提示在13行错误?
--------------------------
Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java:182)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException:
/E:/JavaProjects/test/bin/application/Sample.fxml:7

        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
        at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
        at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
        at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
        at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
        at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at application.MainApp.start(MainApp.java:13)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
        ... 1 more
Caused by: java.lang.ClassNotFoundException: MainController
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920)
        ... 17 more
Exception running application application.MainApp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-5 17:19:52 | 显示全部楼层
sfqxx 发表于 2023-7-5 17:01
试试这个
MainApp.java:

提示错误在13行?
=================
Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java:182)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException:
/E:/JavaProjects/test/bin/application/Sample.fxml:7

        at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
        at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
        at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
        at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
        at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
        at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at application.MainApp.start(MainApp.java:13)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
        ... 1 more
Caused by: java.lang.ClassNotFoundException: MainController
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920)
        ... 17 more
Exception running application application.MainApp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-5 17:21:09 | 显示全部楼层
本帖最后由 wow7jiao 于 2023-7-5 17:22 编辑
sfqxx 发表于 2023-7-5 17:01
试试这个
MainApp.java:


没有运行,提示 maiapp 13行错误
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 17:22:46 | 显示全部楼层
wow7jiao 发表于 2023-7-5 17:21
没有运行,提示 maiapp 13行错误

报错信息粘贴过来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-5 18:36:25 | 显示全部楼层
sfqxx 发表于 2023-7-5 17:22
报错信息粘贴过来

发了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 18:37:31 From FishC Mobile | 显示全部楼层
wow7jiao 发表于 2023-7-5 18:36
发了

粘贴到论坛上,不是图片。是文字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-5 18:42:26 | 显示全部楼层
sfqxx 发表于 2023-7-5 18:37
粘贴到论坛上,不是图片。是文字

在上面,字太多了,要审核,一共发了2次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 19:31:08 From FishC Mobile | 显示全部楼层
wow7jiao 发表于 2023-7-5 18:42
在上面,字太多了,要审核,一共发了2次

明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 17:07:47 | 显示全部楼层
wow7jiao 发表于 2023-7-5 18:42
在上面,字太多了,要审核,一共发了2次

你是怎么组合代码的?发过来,总代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-7 17:09:50 | 显示全部楼层
sfqxx 发表于 2023-7-7 17:07
你是怎么组合代码的?发过来,总代码

一楼的test zip 包,我全打包了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 17:10:29 | 显示全部楼层
wow7jiao 发表于 2023-7-7 17:09
一楼的test zip 包,我全打包了

我是手机党,看不了附件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-7 17:16:39 | 显示全部楼层
sfqxx 发表于 2023-7-7 17:10
我是手机党,看不了附件

代码都在1楼,

MainController.java 应该是要到  sample fxml 里面设置一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 17:24:14 | 显示全部楼层
wow7jiao 发表于 2023-7-7 17:16
代码都在1楼,

MainController.java 应该是要到  sample fxml 里面设置一下

所以你没用我给的代码?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-7 17:25:44 | 显示全部楼层
本帖最后由 wow7jiao 于 2023-7-7 17:27 编辑
sfqxx 发表于 2023-7-7 17:24
所以你没用我给的代码?


用了,运行不了,你少写一部分 提示错误mainapp 15行,                primaryStage.setScene(new Scene(loader.load()));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-7 17:28:57 | 显示全部楼层
sfqxx 发表于 2023-7-7 17:26
根据报错信息,错误的原因是找不到"MainController"类。请确保在`Sample.fxml`文件中正确指定了`controll ...

ok,谢谢。好了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 17:30:00 | 显示全部楼层
wow7jiao 发表于 2023-7-7 17:28
ok,谢谢。好了!

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 21:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表