Java 如何通过在entriesList中反映更改来解决编辑条目和新条目的问题

Java 如何通过在entriesList中反映更改来解决编辑条目和新条目的问题,java,javafx,observable,observablecollection,Java,Javafx,Observable,Observablecollection,我对javafx略知一二,并尽我所能尝试。在反映“entriesList”中的更改时,我遇到了一些问题,它基本上是我在时间线选项卡中显示的“提要框”对象的列表。我很难实现可观察列表 我已经读过使用Bindings.bindcontents来绑定“entiesList”和observableArrayList“条目的内容。通过更改“条目”,我希望将其反映到“entiesList”。不知道这是否是正确的方法。如果你能提出更好的建议,那就太棒了。而且还没有找到适当的方法来更新ObservalElist

我对javafx略知一二,并尽我所能尝试。在反映“entriesList”中的更改时,我遇到了一些问题,它基本上是我在时间线选项卡中显示的“提要框”对象的列表。我很难实现可观察列表

我已经读过使用Bindings.bindcontents来绑定“entiesList”和observableArrayList“条目的内容。通过更改“条目”,我希望将其反映到“entiesList”。不知道这是否是正确的方法。如果你能提出更好的建议,那就太棒了。而且还没有找到适当的方法来更新ObservalElist中的“textField”属性以编辑条目

FeedBox是带有日期、时间和文本字段的VBox

控制器类

     public class Controller {

        public static ObservableList<Node> entries;
        @FXML
            VBox entriesList;

    public void initialize(){
            entries = FXCollections.observableArrayList();
            try {

                ConnectionClass connectionClass = new ConnectionClass();
                Connection conn = connectionClass.getConnection();
                Statement statement = conn.createStatement();
                ResultSet list = statement.executeQuery("SELECT * FROM timeline WHERE user='Kiran' ORDER BY ID DESC;" );
                while (list.next()){
                    entries.add(new FeedBox(list.getString("ID"),list.getString("date"),list.getString("time"),list.getString("text")));
                }
                entriesList.getChildren().addAll(entries);
                Bindings.bindContentBidirectional(entries,entriesList.getChildren());


                System.out.println(entriesList.getChildren());
                Bindings.bindContent(entries, entriesList.getChildren());
                statement.close();
                conn.close();
            }catch (SQLException e){
                e.printStackTrace();
                System.out.println("SQLException");
            }

        }
}
public void OnClick_OKButton(){
        String TABLE_NAME="timeline";
        String USER_NAME="Kiran";
        String TEXT_DATA=textArea.getText();
        String DATE= LocalDate.now().toString();
        String TIME = formatter.format(LocalTime.now());
        String ID;

        try {
            ConnectionClass connectionClass = new ConnectionClass();
            Connection conn = connectionClass.getConnection();
            Statement statement = conn.createStatement();
            statement.execute("INSERT INTO "+ TABLE_NAME + " (user,date,time,text) VALUES('" + USER_NAME + "','" + DATE + "','"+ TIME + "','" + TEXT_DATA + "')" );
            ResultSet res = statement.executeQuery("SELECT ID FROM timeline WHERE DATE='"+DATE+"' AND TIME='"+TIME+"' AND USER='"+USER_NAME+"';");
            res.next();
            ID = res.getString("ID");
            Controller.entries.add(0,new FeedBox(ID,DATE,TIME,TEXT_DATA));
            System.out.println(Controller.entries);
            statement.close();
            conn.close();
        }catch (SQLException e){
            System.out.println("MySQL db conn error");
            e.printStackTrace();
        }
        System.out.println("NewEntry Window closed with OK button");

    }
public void OnClick_OKButton(FeedBox feedBox){
        String TABLE_NAME="timeline";
        String USER_NAME="Kiran";
        String TEXT_DATA = textArea.getText();

        try {
            ConnectionClass connectionClass = new ConnectionClass();
            Connection conn = connectionClass.getConnection();
            Statement statement = conn.createStatement();
            statement.execute("UPDATE timeline SET text=" + "'" + TEXT_DATA + "'" + " WHERE ID=" + id + " AND user=" + "'"+USER_NAME + "';");
            statement.close();
            conn.close();
        }catch (SQLException e){
            System.out.println("MySQL db conn error");
            e.printStackTrace();
        }
        int index=Controller.entries.indexOf(feedBox);
        Controller.entries.add(index,new FeedBox(id,dateText.getText(),timeText.getText(),textArea.getText()));
        Controller.entries.remove(index+1);
        System.out.println("onClick:Button@OKButton");
        System.out.println("EditEntry Dialog closed with OK button");
        System.out.println(Controller.entries);
    }
Bindings.bindContentBidirectional(entriesList.getChildren(),entries);
EditEntryController类

     public class Controller {

        public static ObservableList<Node> entries;
        @FXML
            VBox entriesList;

    public void initialize(){
            entries = FXCollections.observableArrayList();
            try {

                ConnectionClass connectionClass = new ConnectionClass();
                Connection conn = connectionClass.getConnection();
                Statement statement = conn.createStatement();
                ResultSet list = statement.executeQuery("SELECT * FROM timeline WHERE user='Kiran' ORDER BY ID DESC;" );
                while (list.next()){
                    entries.add(new FeedBox(list.getString("ID"),list.getString("date"),list.getString("time"),list.getString("text")));
                }
                entriesList.getChildren().addAll(entries);
                Bindings.bindContentBidirectional(entries,entriesList.getChildren());


                System.out.println(entriesList.getChildren());
                Bindings.bindContent(entries, entriesList.getChildren());
                statement.close();
                conn.close();
            }catch (SQLException e){
                e.printStackTrace();
                System.out.println("SQLException");
            }

        }
}
public void OnClick_OKButton(){
        String TABLE_NAME="timeline";
        String USER_NAME="Kiran";
        String TEXT_DATA=textArea.getText();
        String DATE= LocalDate.now().toString();
        String TIME = formatter.format(LocalTime.now());
        String ID;

        try {
            ConnectionClass connectionClass = new ConnectionClass();
            Connection conn = connectionClass.getConnection();
            Statement statement = conn.createStatement();
            statement.execute("INSERT INTO "+ TABLE_NAME + " (user,date,time,text) VALUES('" + USER_NAME + "','" + DATE + "','"+ TIME + "','" + TEXT_DATA + "')" );
            ResultSet res = statement.executeQuery("SELECT ID FROM timeline WHERE DATE='"+DATE+"' AND TIME='"+TIME+"' AND USER='"+USER_NAME+"';");
            res.next();
            ID = res.getString("ID");
            Controller.entries.add(0,new FeedBox(ID,DATE,TIME,TEXT_DATA));
            System.out.println(Controller.entries);
            statement.close();
            conn.close();
        }catch (SQLException e){
            System.out.println("MySQL db conn error");
            e.printStackTrace();
        }
        System.out.println("NewEntry Window closed with OK button");

    }
public void OnClick_OKButton(FeedBox feedBox){
        String TABLE_NAME="timeline";
        String USER_NAME="Kiran";
        String TEXT_DATA = textArea.getText();

        try {
            ConnectionClass connectionClass = new ConnectionClass();
            Connection conn = connectionClass.getConnection();
            Statement statement = conn.createStatement();
            statement.execute("UPDATE timeline SET text=" + "'" + TEXT_DATA + "'" + " WHERE ID=" + id + " AND user=" + "'"+USER_NAME + "';");
            statement.close();
            conn.close();
        }catch (SQLException e){
            System.out.println("MySQL db conn error");
            e.printStackTrace();
        }
        int index=Controller.entries.indexOf(feedBox);
        Controller.entries.add(index,new FeedBox(id,dateText.getText(),timeText.getText(),textArea.getText()));
        Controller.entries.remove(index+1);
        System.out.println("onClick:Button@OKButton");
        System.out.println("EditEntry Dialog closed with OK button");
        System.out.println(Controller.entries);
    }
Bindings.bindContentBidirectional(entriesList.getChildren(),entries);
我也有这个堆栈跟踪;当在NewEntryController的条目中添加FeedBox对象时,它会在列表中添加两次,如下堆栈跟踪所示。但是,它将在场景中显示(仅显示一次)

控制器类

     public class Controller {

        public static ObservableList<Node> entries;
        @FXML
            VBox entriesList;

    public void initialize(){
            entries = FXCollections.observableArrayList();
            try {

                ConnectionClass connectionClass = new ConnectionClass();
                Connection conn = connectionClass.getConnection();
                Statement statement = conn.createStatement();
                ResultSet list = statement.executeQuery("SELECT * FROM timeline WHERE user='Kiran' ORDER BY ID DESC;" );
                while (list.next()){
                    entries.add(new FeedBox(list.getString("ID"),list.getString("date"),list.getString("time"),list.getString("text")));
                }
                entriesList.getChildren().addAll(entries);
                Bindings.bindContentBidirectional(entries,entriesList.getChildren());


                System.out.println(entriesList.getChildren());
                Bindings.bindContent(entries, entriesList.getChildren());
                statement.close();
                conn.close();
            }catch (SQLException e){
                e.printStackTrace();
                System.out.println("SQLException");
            }

        }
}
public void OnClick_OKButton(){
        String TABLE_NAME="timeline";
        String USER_NAME="Kiran";
        String TEXT_DATA=textArea.getText();
        String DATE= LocalDate.now().toString();
        String TIME = formatter.format(LocalTime.now());
        String ID;

        try {
            ConnectionClass connectionClass = new ConnectionClass();
            Connection conn = connectionClass.getConnection();
            Statement statement = conn.createStatement();
            statement.execute("INSERT INTO "+ TABLE_NAME + " (user,date,time,text) VALUES('" + USER_NAME + "','" + DATE + "','"+ TIME + "','" + TEXT_DATA + "')" );
            ResultSet res = statement.executeQuery("SELECT ID FROM timeline WHERE DATE='"+DATE+"' AND TIME='"+TIME+"' AND USER='"+USER_NAME+"';");
            res.next();
            ID = res.getString("ID");
            Controller.entries.add(0,new FeedBox(ID,DATE,TIME,TEXT_DATA));
            System.out.println(Controller.entries);
            statement.close();
            conn.close();
        }catch (SQLException e){
            System.out.println("MySQL db conn error");
            e.printStackTrace();
        }
        System.out.println("NewEntry Window closed with OK button");

    }
public void OnClick_OKButton(FeedBox feedBox){
        String TABLE_NAME="timeline";
        String USER_NAME="Kiran";
        String TEXT_DATA = textArea.getText();

        try {
            ConnectionClass connectionClass = new ConnectionClass();
            Connection conn = connectionClass.getConnection();
            Statement statement = conn.createStatement();
            statement.execute("UPDATE timeline SET text=" + "'" + TEXT_DATA + "'" + " WHERE ID=" + id + " AND user=" + "'"+USER_NAME + "';");
            statement.close();
            conn.close();
        }catch (SQLException e){
            System.out.println("MySQL db conn error");
            e.printStackTrace();
        }
        int index=Controller.entries.indexOf(feedBox);
        Controller.entries.add(index,new FeedBox(id,dateText.getText(),timeText.getText(),textArea.getText()));
        Controller.entries.remove(index+1);
        System.out.println("onClick:Button@OKButton");
        System.out.println("EditEntry Dialog closed with OK button");
        System.out.println(Controller.entries);
    }
Bindings.bindContentBidirectional(entriesList.getChildren(),entries);
通过使用entriesList.getChildren()作为基本列表条目作为可观察项,列表修复了与所有编辑和新条目相关的问题

谢谢@avi,参数肯定有问题


仍然可以就代码优化或任何可以改进的替代实现提出建议。

这可能是需要使用
列表视图
表格视图
来完成的。我假设这里的问题是双向和非双向绑定。不过,我不认为在这里使用多个
ObservableList
s有什么意义。
entries=entriesList.getChildren()
会不会这样做呢?我个人更喜欢网格窗格,但它可能与调用bindContent有关。可能删除调用,可能切换参数的顺序。BindContentDoublic应该是您所需要的一切,但您可以尝试一下。目前,您违反了@fabian EnteesList.geChildern()中指定的约束,返回节点对象和条目组成了提要框列表。可能是entriesList.getChildren().add()将所有类型的对象存储在节点对象中。@Avi我不知道,但它在添加条目时工作正常,在编辑条目时工作过一次,但之后会引发异常。我假设EditEntryController类中有call Controller.entries.remove(index+1),它负责所有异常。是否有更好的方法从列表中删除列表元素?或者是否也有方法提取entriesList.getChildren()中添加的FeedBox对象?