当前位置: 首页 > 知识库问答 >
问题:

JavaFX/fxml:TableView在编辑项时正确刷新,但在删除项时不正确(ArrayList->TableView)

云新知
2023-03-14

我正在做一个更大的项目(和很多同学一起),我试图在TableView中显示一个arrayList(我们在项目中反复使用的类型,所以我不想仅仅为了我的小问题而将所有这些都改为ObservableLists)。

初始化父根和tableView时,ArrayList主题被转换为ObservableList,并加载到tableView中。

我真的很想从理论上理解,为什么改变成绩对tableView有效,但删除不有效,并知道在实际中该怎么做;-)

提前非常感谢!

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.util.ArrayList;

public class Main extends Application {
    private static ArrayList<Subject> subjects = new ArrayList<>();
    public static ArrayList<Subject> getSubjects () {return subjects;}

//    private static ObservableList<Subject> subjects = FXCollections.observableArrayList();
//    public static ObservableList<Subject> getSubjects () {return subjects;}


    public static void main (String[] args) {

        subjects.add(new Subject("computer science", 2));
        subjects.add(new Subject("literature", 4));

        launch (args);
    }

    public void start (Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("/editMyGrades.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
public class Subject {
    private String subjectName;
    private int grade;

    public Subject (String subjectName, int grade) {
        this.subjectName = subjectName;
        this.grade = grade;
    }

    public String getSubjectName () {return subjectName;}

    public int getGrade () {return grade;}

    public void setGrade (int grade) {this.grade = grade;}


}

控制类EditMyGrades:

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;

import java.util.ArrayList;

public class editMyGrades {

    Subject subjectToEdit;

    @FXML
    private TableView<Subject> tableView;

    @FXML
    private TableColumn<Subject, String> subjectCol;

    @FXML
    private TableColumn<Subject, Number> gradeCol;

    @FXML
    private TextField textField;

    @FXML
    private Button changeButton;

    @FXML
    private Button deleteButton;

    @FXML
    public void initialize() {
        subjectCol.setCellValueFactory(new PropertyValueFactory<>("subjectName"));
        gradeCol.setCellValueFactory(new PropertyValueFactory<>("grade"));

        //tableView.setItems (FXCollections.observableArrayList(Main.getSubjects()));
        ObservableList<Subject> subjects = FXCollections.observableArrayList(Main.getSubjects());
        tableView.setItems(subjects);
    }

    @FXML
    private void tableViewClicked(MouseEvent event) {
        if (event.getClickCount() == 2) {
            subjectToEdit = tableView.getSelectionModel().getSelectedItem();
            textField.setText ("" + tableView.getSelectionModel().getSelectedItem().getGrade());
        }
    }

    @FXML
    private void change(ActionEvent event) {
        subjectToEdit.setGrade(Integer.parseInt(textField.getText()));
        textField.clear();

        tableView.refresh();
    }

    @FXML
    private void delete (ActionEvent event) {
        Subject selectedSubject = tableView.getSelectionModel().getSelectedItem();
        ArrayList<Subject> subjects = Main.getSubjects();
        subjects.remove(selectedSubject);

        tableView.refresh();
    }

}

EditingMyGrades.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="editMyGrades">
   <children>
      <Label text="change your grades!" />
      <HBox>
         <children>
            <TableView fx:id="tableView" onMouseClicked="#tableViewClicked" prefHeight="200.0" prefWidth="518.0">
              <columns>
                <TableColumn fx:id="subjectCol" prefWidth="262.0" text="subject" />
                <TableColumn fx:id="gradeCol" minWidth="0.0" prefWidth="146.0" text="grade" />
              </columns>
            </TableView>
            <VBox alignment="CENTER">
               <children>
                  <Button mnemonicParsing="false" onAction="#delete" text="deleteButton" />
               </children>
            </VBox>
         </children>
      </HBox>
      <TextField fx:id="textField" maxWidth="100.0" />
      <Button fx:id="changeButton" mnemonicParsing="false" onAction="#change" text="Change!" />
   </children>
</VBox>

共有1个答案

戚浩淼
2023-03-14

使用JavaFX时,最好总是使用FXCollections。

当您对ArrayList进行修改时,这些更改不会生成列表更改标记。您必须从tableview获取ObservableList并对其执行操作,因为它是由ArrayList支持的包装器(智能列表)。

 类似资料:
  • 问题内容: 我希望我的笔记应用程序能为您提供一些帮助。假设我的记事清单上有3个记事。我想删除列表顶部的注释。无论我尝试删除哪一个,始终会首先删除列表最底部的注释。我检查了React控制台,并且处于应用程序组件状态的notes数组表示已正确删除。但实际上,事实并非如此。如何获得它以便删除我选择的确切音符? 问题答案: 用作时发生此错误。React使用该属性来跟踪列表中的元素。当您从数组中间删除元素时

  • 我正在用AppWidgetHostViews填充RecyclerView。它们被排序一个比一个低,每个都有删除按钮旁边。这就是我如何设置RecyclerView和适配器(Event.Object是AppWidgetHostView): 这是保存AppWidgetHostViews的适配器: 因此它再次为适配器设置数据并通知数据集已更改。 但问题是,当我单击“删除”按钮时,项目没有被正确删除。Vie

  • 我正在努力研究models.cascade语句的正确用法。我有两种型号的购物车和入门车。如果删除条目,则不会更新购物车条目上的删除。我已经通过管理界面检查过了。我的models.py如下所示:

  • 问题内容: 我正在尝试从ArrayList中删除一个对象。每个Item对象都有3个属性;1. itemNum 2.信息3.费用。我也有3个类,即1。Item类定义了存储在目录中的单个项目。2. Catalog类维护Item对象的列表。3带main方法的客户端类。我在Set类中具有设置并获取,在Catalog中具有ArrayList。在客户端中,提示我“输入要删除的itemNum。如何基于对item

  • 我有一个非常简单的例子,我不能去工作。 我有我的域来建模我的数据库和我的存储库。 Spring数据Rest和Cors 并尝试了下面的代码,但没有成功。 我添加了一个catch all来测试,它应该允许所有CORS wise通过,但是我仍然得到No'Access-Control-Allow-Origin',即使我有“*”。 最终找到了精确的解。我不确定我所拥有的和这种方法之间的区别,但这似乎是有效的

  • 问题内容: 对于任何CSS专家来说,我都有一个棘手的问题。我的绿色div的高度灵活,可以容纳剩余的高度。现在我想在该div中放置一个div,该div应该是绿色div的一半。但似乎Chrome是否将其视为整个页面的一半而不是flex项目。 HTML CSS 问题答案: 您可以绝对定位。 关于您的声明: 但似乎Chrome是否将其视为整个页面的一半而不是flex项目。 您给了。然后给它的孩子()一个。