添加和删​​除仅影响表而不影响列表,我应该怎么做才能使其影响列表

如何解决添加和删​​除仅影响表而不影响列表,我应该怎么做才能使其影响列表

因此,我已经在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",MS",10000,11));
            doctor.add(new Doctor("102","John Lim","Physician","7AM-11AM",7000,45));
            doctor.add(new Doctor("103","Amy Chia","Pediatrician","6PM-11PM","Female",6000,8));
            doctor.add(new Doctor("104","Chris Hemsworth","Neurologist","BDM",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();
    }

}

文档场景控制器

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时它确实保留的单元格 我不明白为什么添加和删除不起作用,我猜测这会影响表而不是列表 如何使功能影响列表?

解决方法

添加或删除医生时,您需要使用ObservableList中的TableView(而不是ArrayList)。经过一些更改,它应该可以工作。请尝试以下方法:

FxmlDocumentController 中将ArrayList更改为此:

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

DocTableController 中,setter方法如下所示:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-