【问题标题】:The add and delete only affect the table not the list what should I do to make it affect the list添加和删​​除只影响表而不影响列表我应该怎么做才能使其影响列表
【发布时间】:2020-12-06 09:13:25
【问题描述】:

所以,我在 DocTableController 中添加和删除函数来编辑 GUI 中的表格。我将 ArrayList 从主控制器链接到 DocTableController。 当我删除并添加项目时,它似乎只对表格有效,但在我返回主菜单并再次返回 DocTable 场景时列表重新初始化时无效。并且当我再次进入 tableView 时不会改变。

主控制器

public class FXMLdocumentController implements Initializable {
    @FXML Label date;
    @FXML Label time;
        
    //define static so in memory only 1 list
    static ArrayList<Doctor> doctor = new ArrayList<Doctor>();
    static int counter = 0;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        //initialise all the list
        if (counter == 0){
            doctor.add(new Doctor("518", "Lew Wei Li", "Surgeon", "10PM-3AM", "MBBS,MD","Male",8000 , 88));
            doctor.add(new Doctor("101", "Tom Wong", "Obstetrician", "8AM-11AM", "MBBS,MS","Male",10000 ,11));
            doctor.add(new Doctor("102", "John Lim", "Physician", "7AM-11AM", "MBBS,MS","Male",7000 ,45));
            doctor.add(new Doctor("103", "Amy Chia", "Pediatrician", "6PM-11PM", "MBBS,MD","Female",6000, 8));
            doctor.add(new Doctor("104", "Chris Hemsworth", "Neurologist", "6PM-11PM", "BDM", "Female",8000,12));
            counter++;
        }
        
        //when the program start get the local computer time and date and display
        Calendar calendar = Calendar.getInstance();
        date.setText("Date: " + calendar.get(Calendar.DATE) + "/" + (calendar.get(Calendar.MONTH) + 1) + "/"
                + calendar.get(Calendar.YEAR));
        time.setText("Time: " + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":"
                + calendar.get(Calendar.SECOND));
    }
    

    
    @FXML
    public void changeScreenDoc(ActionEvent event) throws IOException {//change to doctor session scene
        FXMLLoader loader  = new FXMLLoader();
        loader.setLocation(getClass().getResource("/Gui/DocTable.fxml"));//get the DocTable gui file
        Parent DocParent = loader.load();
        Scene DocScene = new Scene(DocParent);
        
        //get the data to link to other controller
        DocTablecontroller controller = loader.getController();
        controller.setDoc(doctor);
        
        Stage window = (Stage) ((Node) event.getSource()).getScene().getWindow();
        window.setScene(DocScene);
        window.show();
    }

}

Doctable 场景控制器

public class DocTablecontroller implements Initializable {
    //configure table
    @FXML private TableView<Doctor> Doctable;
    @FXML private TableColumn<Doctor, String> Idcol;
    @FXML private TableColumn<Doctor, String> Namecol;
    @FXML private TableColumn<Doctor, String> Speccol;
    @FXML private TableColumn<Doctor, String> Worktimecol;
    @FXML private TableColumn<Doctor, String> Quacol;
    @FXML private TableColumn<Doctor, Integer> RoomNumbercol;
    
    //Instance variable to create object
    @FXML private TextField newId;
    @FXML private TextField newName;
    @FXML private TextField newSpecialist;
    @FXML private TextField newWorktime;
    @FXML private TextField newQual;
    @FXML private TextField newRnum;
    
    //for alert user usage
    Alert a = new Alert(AlertType.WARNING); 
    
    //link the data from main controller
    public void setDoc(ArrayList<Doctor> doclist)
    {
        Doctable.getItems().addAll(doclist);
    }
    
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        
        //setting up the table and tell it where to find the value in the class by ("xx")
        Idcol.setCellValueFactory(new PropertyValueFactory<Doctor,String>("id"));
        Namecol.setCellValueFactory(new PropertyValueFactory<Doctor,String>("name"));
        Speccol.setCellValueFactory(new PropertyValueFactory<Doctor,String>("specialist"));
        Worktimecol.setCellValueFactory(new PropertyValueFactory<Doctor,String>("workTime"));
        Quacol.setCellValueFactory(new PropertyValueFactory<Doctor,String>("qualification"));
        RoomNumbercol.setCellValueFactory(new PropertyValueFactory<Doctor,Integer>("roomNum"));
        
        //Doctable.setItems(Doclist);//injecting the observable list to the table 
        
        //set the table cell to be editable
        Doctable.setEditable(true);
        Idcol.setCellFactory(TextFieldTableCell.forTableColumn());
        Namecol.setCellFactory(TextFieldTableCell.forTableColumn());
        Speccol.setCellFactory(TextFieldTableCell.forTableColumn());
        Worktimecol.setCellFactory(TextFieldTableCell.forTableColumn());
        Quacol.setCellFactory(TextFieldTableCell.forTableColumn());
        RoomNumbercol.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter()));
    }
    
    @FXML
    public void newDoctor() {//add new data(row) in the table(add button)
        Doctor newDoctor = new Doctor();
        boolean flag = true;
        //format checking
        if (!(newDoctor.setId(newId.getText()))){
             newId.setText("Wrong format");
             flag = false;
        }
        if (!(newDoctor.setName(newName.getText()))){
             newName.setText("Wrong format");
        }
        if (!(newDoctor.setSpecialist(newSpecialist.getText()))){
             newSpecialist.setText("Wrong format");
             flag = false;
        }
        if (!(newDoctor.setWorkTime(newWorktime.getText()))){
             newWorktime.setText("Wrong format");
             flag = false;
        }
        if (!(newDoctor.setQualification(newQual.getText()))){
             newQual.setText("Wrong format");
             flag = false;
        }
        if (!(newDoctor.setRoomNum(newRnum.getText()))){
             newRnum.setText("Wrong format");
             flag = false;
        }
        //if the format all correct allow to add new input else alert user some input format is wrong
        if(flag)
        {
            Doctable.getItems().add(newDoctor);
            
        }
        else 
        {
            a.setTitle("Input alert");
            a.setContentText("Input format wrong! please check again");
            a.showAndWait();
        }
    }
    
    //edit cell when a cell is double clicked
    public void changeCellEvent(CellEditEvent<?, ?> edittedcell)
    {
        //get the selected doctor data
        Doctor docSeleted = Doctable.getSelectionModel().getSelectedItem();
        //gone through format checking
        if(!(docSeleted.setId(edittedcell.getNewValue().toString())))
        {
            //alert if pattern not match
            a.setTitle("Input alert");
            a.setContentText("Input format wrong! please check again");
            a.showAndWait();
        }
        Doctable.refresh();//if no this then the value of edited row will stay as the user input string 
    }
    
    
    //delete user selected cell
    public void dlt() {
            Doctable.getItems().removeAll(Doctable.getSelectionModel().getSelectedItems());
    }
    
    
    @FXML//change scene(main menu button)
    public void BackMenu(ActionEvent event) throws IOException {
        FXMLLoader loader  = new FXMLLoader();
        loader.setLocation(getClass().getResource("/Gui/Menu.fxml"));
        Parent MenuParent = loader.load();
        
        Scene MenuScene = new Scene(MenuParent);
        
        Stage window = (Stage) ((Node) event.getSource()).getScene().getWindow();
        window.setScene(MenuScene);
        window.show();
    }

    
}

添加和删除确实会影响 GUI 中的表 并使用编辑功能编辑当我进入主菜单并返回 DocTable 时它确实保留的单元格 我不明白为什么添加和删除不起作用,我猜它会影响表而不是列表 如何使函数影响列表?

【问题讨论】:

  • minimal reproducible example 请注意 M (没有人想涉足大量不相关的代码,将其剥离只是为了演示什么没有按预期工作 - 必须包括 fxml以及控制器和样板应用程序)。另外,向 cmets 学习你之前的问题,尤其是学习 java 命名约定并坚持下去!
  • 一些注意事项:不要使用静态范围(它几乎总是不是你想要的),不要使用旧的日历类..并阅读 api doc您使用的类猜测它会影响表格但不影响列表是正确的,但没什么好猜测的:)

标签: java javafx arraylist tableview scenebuilder


【解决方案1】:

当您添加或删除医生时,您使用的是 ObservableListObservableList(而不是 ArrayList)。通过一些更改,它应该可以工作。请试试这个:

FxmlDocumentController 中的 ArrayList 更改为:

ObservableList<Doctor> doctors = FXCollections.observableArrayList();

DocTableController 中,setter 方法可以如下所示:

public void setDoc(ObservableList<Doctor> docList) {
    docTable.getItems().setAll(docList);
}

顺便说一句:请查看Java Naming Conventions。 ;-)

【讨论】:

  • 不相关:这种粗体和代码标签的混合(对于单个作品)对于阅读流程来说非常糟糕,IMO。两者都不需要(关键字/类名的代码标签是有争议的,不过,我正在打一场失败的战斗:))
  • @kleopatra 所以首先感谢您的建议,我只学了几周,这项作业将在 1 周内完成,但老师对此一无所知。我不知道为什么你听起来如此生气,我为你的不便道歉,对不起,我知道这是我的错我会尝试学习 Java 命名约定,但在我目前的时间里,我真的只是尽力做到最好,尽可能多地找到
  • @anko 我知道这项工作,但我的任务限制我们使用 arraylist 哈哈,所以还是谢谢
  • @javafxnewbie 每当您发布代码(又名:用代码提问)时,您就可以进行交流。通过遵守(java 命名)约定使通信尽可能简单符合您自己的利益:如果没有,人们可能甚至不会费心阅读您的内容,因为看起来您没有投入任何努力来使通信顺畅。
猜你喜欢
  • 1970-01-01
  • 2018-02-04
  • 2018-04-26
  • 2020-05-12
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2022-01-21
  • 2012-12-14
相关资源
最近更新 更多