Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tableview JavaFX中自定义行和单元格的更好实践_Java_Mysql_Database_Javafx_Tableview - Fatal编程技术网

tableview JavaFX中自定义行和单元格的更好实践

tableview JavaFX中自定义行和单元格的更好实践,java,mysql,database,javafx,tableview,Java,Mysql,Database,Javafx,Tableview,我创建了一个如下所示的表视图: 为此,我做了以下几点: 1.-创建表示MySQL数据库中的表“Modulo”的POJO的可观察列表,我使用以下代码创建了表视图的列: public ObservableList<Modulo> cargaTablaHabilitadosMasHoras(Connection conex){ ObservableList<Modulo> listaMod = FXCollections.observableArrayList();

我创建了一个如下所示的表视图:

为此,我做了以下几点:

1.-创建表示MySQL数据库中的表“Modulo”的POJO的可观察列表,我使用以下代码创建了表视图的列:

public ObservableList<Modulo> cargaTablaHabilitadosMasHoras(Connection conex){
    ObservableList<Modulo> listaMod = FXCollections.observableArrayList();
    String sql = "SELECT id_Mod, nombre_Mod, \n" +
                 "  Turno_Mod, capacidad_Mod, id_Us, \n" +
                 "  status_Mod \n"+
                 "FROM Modulo;";
    //Static first column
    listaMod.add(new Modulo("123", "Horario", "Rhut", 10, "123", true));
    try(PreparedStatement stta = conex.prepareStatement(sql);
          ResultSet res = stta.executeQuery()) {
        while (res.next()) {
            if (res.getBoolean("status_Mod")) {
               listaMod.add(new Modulo( res.getString ("id_Mod"), 
                                     res.getString ("nombre_Mod"), 
                                     res.getString ("Turno_Mod"), 
                                     res.getInt    ("capacidad_Mod"), 
                                     res.getString ("id_Us"), 
                                     res.getBoolean("status_Mod"))); 
            }
        }
    }catch (SQLException ex) {
        ex.printStackTrace();
    }
    return listaMod;
}
public void otraTabla(Connection conex){
    //loads the observable list of the POJO that represents the table Modulo
    columns = modu.cargaTablaHabilitadosMasHoras(conex);
    /*
    creates and observable list that is going to be the base 
    of the tableview creating a grid of 8 x number of colums 
    obtained of the first list + 1 column that represents the hours
    */
    ObservableList<String> row = FXCollections.observableArrayList();
    row.addAll("1","2","3","4","5","6","7","8");
    //for loop that iterates the tableview columns
    for(Modulo columName : columns) {
        //creates and column object to be integrated and manipulated 
        //whit the name of the column in the first list
        TableColumn<String, String> col = new TableColumn(columName.getNombre_Mod());
        //verify if is the first column with contains the hours
        if (columName.getNombre_Mod().equals("Horario")) {
            //if is the one creates the rows with the hours staring at 6 am
            col.setCellValueFactory(cellData -> {
                //star at 6 am
                LocalTime lol = LocalTime.of(6, 0);
                //get the value of ObservableList<String> row for for adding to LocalTime
                Integer p = Integer.valueOf(cellData.getValue());
                //adds the value to localtime
                lol = lol.plusHours(p);
                //Gives a format for the hour
                DateTimeFormatter kk = DateTimeFormatter.ofPattern("hh:mm");
                //returns the new String
                return new SimpleStringProperty(lol.format(kk));
            });

        }else{
            //if is a column load dinamically then gets 
            //the next date where there is space in the column at that time 
            col.setCellValueFactory(cellData -> {
                String regresaFecha = "";
                //Conection to the database it conection to the database it 
                //have to be inside of the loop or else the conection is lost
                try(Connection localConnection = dbConn.conectarBD()) {
                    //get the level of the row in this case the hour
                    LocalTime lol = LocalTime.of(6, 0);
                    Integer p = Integer.valueOf(cellData.getValue());
                    lol = lol.plusHours(p);
                    //calls the method that calculed the next date where there is space in the table of the database 
                    LocalDate fechaApunter = rehab.compararDiaADia(localConnection, Date.valueOf(LocalDate.now()),
                            Time.valueOf(lol), columName.getId_Mod(), columName.getCapacidad_Mod(), 30);
                    //date sent to the row of the tableview
                    regresaFecha = fechaApunter.toString();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                return new SimpleStringProperty(regresaFecha);
            });
        }

        //change color of the date depending of the 
        //distant relevant to the day is making the query to the database
        if (!columName.getNombre_Mod().equals("Horario")) {
            col.setCellFactory (coli -> {
                TableCell<String, String> cell = new TableCell<String, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item != null) {
                            LocalDate lol = LocalDate.parse(item);
                            Text text = new Text(item);
                            if (lol.isAfter(LocalDate.now())) {
                                if (lol.isAfter(LocalDate.now().plusDays(5))) {
                                    text.setStyle(" -fx-fill: #990000;" + 
                                                  " -fx-text-alignment:center;");
                                }else
                                    text.setStyle(" -fx-fill: #cccc00;" + 
                                              " -fx-text-alignment:center;");
                            }
                            this.setGraphic(text);
                        }
                    }
                };
                return cell;
            });
        }

        //add the column to the tableview
        tvDisponivilidad.getColumns().addAll(col);
    }
    //add the Observable list place holder
    tvDisponivilidad.setItems(row);
}
我的问题是:

SELECT COUNT(id_Reab) AS Resultado
FROM Rehabilitacion
WHERE '2016-06-01' BETWEEN inicio_Reab AND fin_Reab
AND horario_Reab = '07:00'
AND id_Modulo = '215A3';
在本模块中,结果是6,我的容量是5,因此我必须提前一天再次询问,直到在2016-06-11之前,在本示例中,它找到小于5的一天。要到达这里,我必须进行10次查询并打开10个连接。我使用了一个连接池,它非常高效,但是它被这10个查询淹没了,这些查询只针对第一列中的第一行,通常有15到20列,假设一行只有一个查询,它仍然是120-160个连接

每次我都尝试重用一个连接,我的第一反应是使用连接,该连接传递给加载可观察的模块列表的方法,但当我这样做时,该方法会使日期查询接收到的连接在没有明显原因的情况下关闭。经过多次测试,我得出了与setCellValueFactory方法的lambda有关的结论,如果我想建立连接,它必须在内部创建更多连接。我想通过在不同的线程中加载一个任务来减轻这种情况,但结果相似

解决这个问题的方法是专门为表创建一个POJO,但我认为不可能动态创建一个类。我可以有一个包含20个可能的列的POJO,并且只加载我将使用的列,但是当有超过20个列或者模块的名称更改时会发生什么

所以我的问题是:如何更快地创建表?有没有更好的方法实现这一目标?我不喜欢我的代码解决方案,它比我希望的更复杂,我希望有一个更好更干净的方法

mysql> SELECT * FROM imssRehab.Rehabilitacion;
+---------+-------------+------------+-----------------+---------+-----------+
| id_Reab | inicio_Reab | fin_Reab   | horario_Reab    | id_Prog | id_Modulo |
+---------+-------------+------------+-----------------+---------+-----------+
| 1       | 2016-06-01  | 2016-06-10 | 07:00:00.000000 | 1       | 215A3     |
| 2       | 2016-06-01  | 2016-06-10 | 07:00:00.000000 | 1       | 215A3     |
| 3       | 2016-06-01  | 2016-06-10 | 07:00:00.000000 | 1       | 215A3     |
| 4       | 2016-06-01  | 2016-06-10 | 07:00:00.000000 | 1       | 215A3     |
| 5       | 2016-06-01  | 2016-06-10 | 07:00:00.000000 | 1       | 215A3     |
| 6       | 2016-06-01  | 2016-06-10 | 07:00:00.000000 | 1       | 215A3     |
+---------+-------------+------------+-----------------+---------+-----------+
SELECT COUNT(id_Reab) AS Resultado
FROM Rehabilitacion
WHERE '2016-06-01' BETWEEN inicio_Reab AND fin_Reab
AND horario_Reab = '07:00'
AND id_Modulo = '215A3';