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