如何解决添加和删除仅影响表而不影响列表,我应该怎么做才能使其影响列表
因此,我已经在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 举报,一经查实,本站将立刻删除。