2016-05-17 42 views
0

我是JavaFX的新手,也不是很熟悉在Java中使用数据库,但我必须将我现有的JavaFX程序转换为删除填充TableView的列表表中,并将其替换为数据库中的项目,并赋予用户添加或删除的能力。这实质上是一个学生课程注册程序的非常简化的版本。一切正常,我只需要使用一个数据库,这样教师就可以用来查看哪些学生注册了哪些课程。我只是不熟悉调用数据库并将其应用于tableView的最佳方式。我希望能够在桌面上选择一行,点击我的动作按钮并注册该学生。任何帮助是极大的赞赏。Javafx,使用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>(); 
     } 

回答

1

你的问题可能有点过于宽泛要回答#,但是好了,我把链接到其他一些问题和异地资源,可以帮助一个答案无论如何。


Sample for accessing a local database from JavaFX使用的数据库操作并发任务,使用户界面保持响应。

用于样品相关的StackOverflow问题是:

将样品基于嵌入式H2 database

本示例使用JDBC,这适用于几个基本操作,例如示例中演示的。对于更广泛的系统,最好直接使用JPA而不是JDBC。

更多资源:

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

您可能希望在应用程序中使用一些基本的MVC设计原则,而不是像您在问题中提供的那样将数据模型嵌入到控制器中。做MVC部分可能会对你有点棘手。你可以谷歌关于它并使用框架,但最终可能会让你感到困惑。也许,只是尝试在没有任何框架的情况下对其进行编码,但也许只是一个小小的定制设计工作,并且如果需要的话,改装一个MVC类型系统,比如Afterburner.fx或者Gluon Ignite,如果你发现你会受益于你在发展中取得进展。

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