Javafx,将 TableView 与数据库结合使用

标签 java database javafx tableview selectionmodel

我对 JavaFX 还很陌生,而且对在 Java 中使用数据库也不太熟悉,但我必须转换我制作的现有 JavaFX 程序,以删除填充 TableView 表的列表并将其替换为项目从数据库中获取,并让用户能够添加或删除。这本质上是学生类(class)注册程序的一个非常简化的版本。一切按原样进行,我只需要使用一个数据库,以便教员方可以查看哪些学生注册了哪些类(class)。我只是不熟悉调用数据库并将其应用到 tableView 的最佳方式。我希望能够选择表格上的一行,单击我的操作按钮并注册该学生。非常感谢任何帮助。

代码:

public class Screen3Controller implements Initializable {


        @FXML private Button continuebtn;
        @FXML private Button studAddCrseBtn;
        @FXML private Button yesBtn;
        @FXML private Label regStatus;


        @FXML private TableView<SummerClass> table;

        @FXML private TableColumn<SummerClass, Integer> id;
        @FXML private TableColumn<SummerClass, String> dept;
        @FXML private TableColumn<SummerClass,Integer> number;
        @FXML private TableColumn<SummerClass, String> title;
        @FXML private TableColumn<SummerClass, String> day;
        @FXML private TableColumn<SummerClass, String> time;
        @FXML private TableColumn<SummerClass, Boolean> checkbox;




        private ObservableSet<CheckBox> selectedCheckBoxes = FXCollections.observableSet();
        private ObservableSet<CheckBox> unselectedCheckBoxes = FXCollections.observableSet();

        private IntegerBinding numCheckBoxesSelected = Bindings.size(selectedCheckBoxes);

        @FXML
        private IntegerProperty index = new SimpleIntegerProperty();

        private final int maxNumSelected = 3;

public ObservableList<SummerClass> list1 = FXCollections.observableArrayList(
        new SummerClass (10001, "ACCT", 1010 , "Intro to Acct (3)", "MWF", "1:00 - 2:15" ),
        new SummerClass (10002, "ACCT", 2010 , "Acct for Bus. (3)", "MWF", "9:00 - 10:15" ),
        new SummerClass (10003, "ART", 1010 , "Fund. of Art (3)", "TR", "3:00 - 4:15" ),
        new SummerClass (10004, "ART", 1110 , "Art History (3)", "MWF", "1:00 - 2:15" ),
        new SummerClass (10005, "BIOL", 1010 , "Principles of Biology I (3)", "TR", "9:00 - 10:15" ),
        new SummerClass (10006, "BIOL", 2010 , "Principles of Biology II (3)", "MWF", "3:00 - 4:15" ),
        new SummerClass (10007, "CHEM", 1010 , "Principles of Chemistry I (3)", "MWF", "1:00 - 2:15" ),
        new SummerClass (10008, "CHEM", 2010 , "Principles of Chemistry II (3)", "TR", "9:00 - 10:15" ),
        new SummerClass (10009, "CPSC", 1010 , "Java I (3)", "TR", "3:00 - 4:15" ),
        new SummerClass (10010, "CPSC", 2010 , "Java II (3)", "MWF", "9:00 - 10:15" ),
        new SummerClass (10011, "ENGL", 1010 , "Composition I (3)", "MWF", "1:00 - 2:15" ),
        new SummerClass (10012, "ENGL", 2010 , "Composition II (3)", "TR", "3:00 - 4:15" ),
        new SummerClass (10013, "FIN", 1010 , "Principles of Finance I (3)", "MWF", "1:00 - 2:15" ),
        new SummerClass (10014, "FIN", 2010 , "Principles of Finance II (3)", "TR", "9:00 - 10:15" ),
        new SummerClass (10015, "GEO", 1010 , "Intro to Geology (3)", "MWF", "3:00 - 4:15" ),
        new SummerClass (10016, "GEO", 3610 , "Geology in History (3)", "TR", "1:00 - 2:15" ),
        new SummerClass (10017, "HIST", 1210 , "Western History (3)", "MWF", "9:00 - 10:15" ),
        new SummerClass (10018, "HIST", 1510 , "Fund. of History (3)", "MWF", "3:00 - 4:15" ),
        new SummerClass (10019, "MATH", 1010 , "Elementary Algebra (3)", "TR", "1:00 - 2:15" ),
        new SummerClass (10020, "MATH", 2010 , "Linear Algebra (3)", "MWF", "9:00 - 10:15" ),
        new SummerClass (10021, "NUTR", 1010 , "Nutrition Fundamentals (3)", "TR", "3:00 - 4:15" ),
        new SummerClass (10022, "PHYS", 1010 , "Intro to Physics (3)", "MWF", "1:00 - 2:15" ),
        new SummerClass (10023, "PHYS", 2010 , "Physics II (3)", "MWF", "9:00 - 10:15" ),
        new SummerClass (10024, "POL", 1010 , "Political Science I (3)", "TR", "3:00 - 4:15" ),
        new SummerClass (10025, "POL", 1010 , "Political Science II (3)", "MWF", "1:00 - 2:15" ),
        new SummerClass (10026, "STEM", 1010 , "Stem Education I (3)", "TR", "9:00 - 10:15" ),
        new SummerClass (10027, "STEM", 2010 , "Advanced Stem Education (3)", "TR", "3:00 - 4:15" ),
        new SummerClass (10028, "STEM", 3010 , "Stem Education in Business (3)", "MWF", "1:00 - 2:15" ));  


final ObservableList<SummerClass> list2 = FXCollections.observableArrayList();

@Override
public void initialize(URL location, ResourceBundle resources) {


    id.setCellValueFactory(new PropertyValueFactory<>("id"));
    dept.setCellValueFactory(new PropertyValueFactory<>("dept"));
    number.setCellValueFactory(new PropertyValueFactory<>("number"));
    title.setCellValueFactory(new PropertyValueFactory<>("title"));
    day.setCellValueFactory(new PropertyValueFactory<>("day"));
    time.setCellValueFactory(new PropertyValueFactory<>("time"));
    checkbox.setCellValueFactory(new PropertyValueFactory<SummerClass, Boolean>(""));
    checkbox.setCellFactory(new Callback<TableColumn<SummerClass, Boolean>, TableCell<SummerClass, Boolean>>(){
        public TableCell<SummerClass, Boolean> call(TableColumn<SummerClass, Boolean> p){
            return new CheckBoxTableCell<SummerClass, Boolean>();
        }

最佳答案

您的问题可能有点太宽泛,无法在 StackOverflow 上得到解答,但是我会提供一个答案,其中链接到一些其他问题和场外资源,无论如何都可能对您有所帮助。

<小时/>

Sample for accessing a local database from JavaFX使用并发任务进行数据库操作,以便 UI 保持响应。

示例的相关 StackOverflow 问题是:

该示例基于嵌入的 H2 database .

此示例使用 JDBC,这对于一些基本操作(例如示例中演示的操作)来说很好。对于更广泛的系统,最好使用JPA,而不是直接使用JDBC。

更多资源:

比将 JavaFX 应用程序直接连接到数据库更灵活的设计是使用三层架构而不是两层架构。为此,您需要在数据库前面提供一个基于网络的服务层(例如使用 JAX-RS 的 SpringBoot 或 WildFly Swarm),然后从客户端应用程序与服务层进行通信。服务层负责所有与数据库相关的操作。然而,构建这样的应用程序比直接连接到数据库要复杂得多。

您可能希望在应用程序中使用一些基本的 MVC 设计原则,而不是像您在问题中提供的那样将数据模型嵌入到 Controller 中。完成 MVC 部分对您来说可能会有点棘手。您可以通过谷歌搜索并使用框架,但这可能最终会让您感到困惑。也许,只是尝试在没有任何框架的情况下对其进行编码,但也许只是一些自定义设计工作,并且如果需要的话,改造 MVC 类型系统,例如 Afterburner.fx 或 Gluon Ignite,如果您发现您会受益于这样的事情你在发展中取得了进步。

鉴于这是一个学生项目而不是大型商业产品,我建议只采用最简单的解决方案,扩展前面引用的基于 H2 的示例以提供您需要的功能,而不是引入大量其他技术或库例如JPA、JAX-RS、网络服务等。

关于Javafx,将 TableView 与数据库结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37286018/

相关文章:

java - 在 Eclipse 中调试 Web 应用程序

具有数据库可执行文件的 JavaFx 应用程序

sql - 如何将管道分隔的文本文件数据导入 SQL Server 表

java - 如何从 JavaFX 场景图节点获取边框宽度?

java - 生成 int 列表以填充 JavaFX 中的 ComboBox

JavaFX 鼠标拖动事件未触发

java - 自引用 MD5 文件

java - InvalidDataAccessApiUsageException : Parameter value [. ..] 与预期类型不匹配 [java.util.UUID (n/a)]

java - 如何修复 'Exception in thread "main"java.lang.NoClassDefFoundError : org/eclipse/swt/SWT' in Java

php - MySQL -PHP 插入 DATETIME