Работа с XML-файлами - Java
Формулировка задачи:
Суть задания: пользователь может редактировать табличные данные, сохранить и загружать в XML. У меня же выбивает кучу исключений, открывает только созданный мною XML, не позволяет создавать новый документ и не дает редактировать данные.
MeetingsController.java
XMLConference.java
package application; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import javax.xml.bind.JAXBException; import lab.src.pack.*; import graph.*; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Alert; import javafx.scene.control.TableColumn.CellEditEvent; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.control.TextArea; import javafx.scene.control.TableView; import javafx.scene.control.TableColumn; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.TextFieldTableCell; import javafx.stage.FileChooser; import javafx.util.converter.DoubleStringConverter; import javafx.util.converter.IntegerStringConverter; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; public class MeetingsController implements Initializable{ private XMLConference conference = new XMLConference(); private ObservableList<Meeting> observableList; public static void showMessage (String message){ Alert alert = new Alert (AlertType.INFORMATION); alert.setTitle(""); alert.setHeaderText(message); alert.showAndWait(); } public static void showError (String message){ Alert alert = new Alert (AlertType.ERROR); alert.setTitle("Помилка"); alert.setHeaderText(message); alert.showAndWait(); } public static FileChooser getFileChooser(String title) { FileChooser fileChooser = new FileChooser(); fileChooser.setInitialDirectory(new File(".")); fileChooser.getExtensionFilters().add( new FileChooser.ExtensionFilter("XML-файли (*.xml)", "*.xml")); fileChooser.getExtensionFilters().add( new FileChooser.ExtensionFilter("Усі файли (*.*)", "*.*")); fileChooser.setTitle(title); return fileChooser; } @FXML TextField textFieldPlace; @FXML TextField textFieldName; @FXML TextArea textAreaLength; @FXML TextArea textAreaAverage; @FXML TextArea textAreaMax; @FXML TableView<Meeting> tableViewMeetings; @FXML TableColumn<Meeting, String> tableColumnPlace; @FXML TableColumn<Meeting, Double> tableColumnDate; @FXML TableColumn<Meeting, Integer> tableColumnNum; @FXML TableColumn<Meeting, String> tableColumnTopic; @Override public void initialize(URL location, ResourceBundle resources) { tableViewMeetings.setPlaceholder(new Label("")); } @FXML public void doNew(ActionEvent event) { conference = new XMLConference(); observableList = null; textFieldPlace.setText(""); textFieldName.setText(""); textAreaLength.setText(""); textAreaMax.setText(""); textAreaAverage.setText(""); tableViewMeetings.setItems(null); tableViewMeetings.setPlaceholder(new Label("")); } @FXML public void doOpen(ActionEvent event) { FileChooser fileChooser = getFileChooser("Відкрити XML-файл"); File file; if ((file = fileChooser.showOpenDialog(null)) !=null){ try{ conference.readFromXML(file.getCanonicalPath()); textFieldPlace.setText(conference.getPlace()); textFieldName.setText(conference.getName()); textAreaLength.setText(""); textAreaMax.setText(""); textAreaAverage.setText(""); tableViewMeetings.setItems(null); updateTable(); } catch (IOException e){ showError("Файл не знайдено"); } catch (JAXBException e){ showError ("Непрвильний формат файлу"); } } } @FXML public void doSave(ActionEvent event) { FileChooser fileChooser = getFileChooser ("Зберегти XML-файл"); File file; if ((file = fileChooser.showSaveDialog(null)) != null){ try { updateSourceData(); conference.writeToXML(file.getCanonicalPath()); showMessage("Результати успішно збережені"); } catch (Exception e){ showError ("Помилка запису в файл"); } } } @FXML public void doExit(ActionEvent event) { Platform.exit(); } @FXML public void doAdd(ActionEvent event) { if (observableList == null){ updateTable(); } observableList.add (new Meeting(0, 0, "")); } @FXML public void doRemove(ActionEvent event) { if (observableList == null){ return; } if (observableList.size()>0){ observableList.remove(observableList.size() - 1); } if (observableList.size() <= 0){ observableList = null; } } @FXML public void doSortByQuantity(ActionEvent event) { updateSourceData(); conference.sortByQuantity(); updateTable(); } @FXML public void doSortByAlphabet(ActionEvent event) { updateSourceData(); conference.sortByAlphabet(); updateTable(); } @FXML public void doAbout(ActionEvent event) { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Про програму..."); alert.setHeaderText("Дані про конференцію"); alert.setContentText("Версія 3.0"); alert.showAndWait(); } @FXML public void doPlaceChanged (ActionEvent event){ conference.setPlace(textFieldPlace.getText()); } @FXML public void doWork (ActionEvent event){ updateSourceData(); textAreaMax.setText(""); textAreaLength.setText(""); textAreaAverage.setText(""); Meeting max = conference.getMeeting(0); for (int i = 0; i < conference.meetingCount(); i++){ Meeting m1 = conference.getMeeting(i); if (max.getNum() < m1.getNum()){ max = m1; } } showMax(max); textAreaLength.appendText(conference.NameLength()+" символів.\n"); textAreaAverage.appendText (conference.Average()+"\n"); } @FXML public void nameChanged (ActionEvent event){ conference.setName(textFieldName.getText()); } private void showMax (Meeting meeting){ textAreaMax.appendText(meeting.getTopic()+"\n"); } private void updateSourceData(){ conference.clearMeeting(); for (Meeting m : observableList){ conference.addMeeting(m); } } private void updateTopic (CellEditEvent<Meeting, String> t){ Meeting m = (Meeting) t.getTableView().getItems().get(t.getTablePosition().getRow()); m.setTopic(t.getNewValue()); } private void updateDate (CellEditEvent<Meeting, Double> t){ Meeting m = (Meeting) t.getTableView().getItems().get(t.getTablePosition().getRow()); m.setDate(t.getNewValue()); } private void updateNum (CellEditEvent<Meeting, Integer> t){ Meeting m = (Meeting) t.getTableView().getItems().get(t.getTablePosition().getRow()); m.setNum(t.getNewValue()); } private void updateTable(){ List<Meeting> list = new ArrayList<Meeting>(); observableList = FXCollections.observableList(list); for (int i = 0; i < conference.meetingCount(); i++){ list.add(conference.getMeeting(i)); } tableViewMeetings.setItems(observableList); tableColumnPlace.setSortable(false); conference.setPlace(textFieldPlace.getText()); tableColumnDate.setCellValueFactory(new PropertyValueFactory<>("date")); tableColumnDate.setCellFactory(TextFieldTableCell.<Meeting, Double>forTableColumn(new DoubleStringConverter())); tableColumnDate.setOnEditCommit(t -> updateDate(t)); tableColumnNum.setCellValueFactory(new PropertyValueFactory<>("num")); tableColumnNum.setCellFactory(TextFieldTableCell.<Meeting, Integer>forTableColumn(new IntegerStringConverter())); tableColumnNum.setOnEditCommit(t -> updateNum(t)); tableColumnTopic.setCellValueFactory(new PropertyValueFactory<>("topic")); tableColumnTopic.setCellFactory(TextFieldTableCell.forTableColumn()); tableColumnTopic.setOnEditCommit(t -> updateTopic(t)); } }
package graph; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.Collections; import java.util.Comparator; import javax.xml.bind.*; import lab.src.pack.AbstractConference; import lab.src.pack.Meeting; import xml.ConferenceData; import static xml.ConferenceData.MeetingData; public class XMLConference extends AbstractConference { private static ConferenceData cd; @Override public String getName() { return cd.getName(); } @Override public void setName(String name) { cd.setName(name); } @Override public String getPlace(){ return cd.getPlace(); } @Override public void setPlace (String Place){ cd.setPlace(Place); } @Override public Meeting getMeeting(int i) { MeetingData data = cd.getMeetingData().get(i); Meeting meeting = new Meeting (data.getDate(), data.getNum(), data.getTopic()); return meeting; } @Override public void setMeeting(int i, Meeting meeting) { MeetingData data = new MeetingData(); data.setDate(meeting.getDate()); data.setNum(meeting.getNum()); data.setTopic(meeting.getTopic()); cd.getMeetingData().set(i, data); } @Override public int meetingCount() { return cd.getMeetingData().size(); } @Override public void addMeeting(Meeting meeting) { MeetingData data = new MeetingData(); data.setDate(meeting.getDate()); data.setNum(meeting.getNum()); data.setTopic(meeting.getTopic()); cd.getMeetingData().add(data); } @Override public void clearMeeting() { cd.getMeetingData().clear(); } @Override public void sortByQuantity() { Collections.sort(cd.getMeetingData(), new Comparator<MeetingData>(){ public int compare (MeetingData m1, MeetingData m2){ return Double.compare(m1.getNum(), m2.getNum()); } }); } @Override public void sortByAlphabet() { Collections.sort(cd.getMeetingData(), new Comparator<MeetingData>(){ public int compare(MeetingData m1, MeetingData m2){ return m1.getTopic().compareTo(m2.toString()); } }); } public static void readFromXML(String fileName) throws JAXBException, FileNotFoundException { JAXBContext jaxbContext = JAXBContext.newInstance("xml"); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); cd = (xml.ConferenceData) unmarshaller.unmarshal(new FileInputStream(fileName)); } public static void writeToXML(String fileName) throws JAXBException, IOException { JAXBContext jaxbContext = JAXBContext.newInstance("xml"); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(cd, new FileWriter(fileName)); } protected void test() { try { readFromXML("src/xml/Conference.xml"); showData("Вихідні дані:"); System.out.println("Зустріч з найбільшою кількістю учасників: " + MaxMeet()); sortByQuantity(); showData("Сортування за кількістю учасників:"); sortByAlphabet(); showData("Сортування за алфавітом тем:"); writeToXML("src/xml/ByComments.xml"); readFromXML("src/xml/ByComments.xml"); } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String[] args) { new XMLConference().test(); } }
Решение задачи: «Работа с XML-файлами»
textual
Листинг программы
<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.layout.BorderPane?> <BorderPane prefHeight="453.0" prefWidth="749.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MeetingsController"> <top> <MenuBar prefHeight="25.0" prefWidth="6837.0" BorderPane.alignment="CENTER"> <menus> <Menu mnemonicParsing="false" text="Файл"> <items> <MenuItem mnemonicParsing="false" onAction="#doNew" text="Новий" /> <MenuItem mnemonicParsing="false" onAction="#doOpen" text="Відкрити..." /> <MenuItem mnemonicParsing="false" onAction="#doSave" text="Зберегти..." /> <SeparatorMenuItem mnemonicParsing="false" /> <MenuItem mnemonicParsing="false" onAction="#doExit" text="Вийти" /> </items> </Menu> <Menu mnemonicParsing="false" text="Редагування"> <items> <MenuItem mnemonicParsing="false" onAction="#doAdd" text="Додати рядок" /> <MenuItem mnemonicParsing="false" onAction="#doRemove" text="Видалити останній рядок" /> </items> </Menu> <Menu mnemonicParsing="false" text="Робота"> <items> <MenuItem mnemonicParsing="false" onAction="#doSortByQuantity" text="Сортування за кількістю учасників" /> <MenuItem mnemonicParsing="false" onAction="#doSortByAlphabet" text="Сортування за алфавітом тем" /> </items> </Menu> <Menu mnemonicParsing="false" text="Допомога"> <items> <MenuItem mnemonicParsing="false" onAction="#doAbout" text="Про програму..." /> </items> </Menu> </menus> </MenuBar> </top> <left> <AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> <children> <Label layoutX="14.0" layoutY="27.0" text="Місце проведення конференції" /> <TextField fx:id="textFieldPlace" layoutX="13.0" layoutY="44.0" onAction="#doPlaceChanged" prefHeight="25.0" prefWidth="200.0" /> <Label layoutX="13.0" layoutY="83.0" text="Назва конференції" /> <TextField fx:id="textFieldName" layoutX="13.0" layoutY="100.0" prefHeight="25.0" prefWidth="200.0" /> <Label layoutX="13.0" layoutY="170.0" text="Довжина назви конференції" /> <TextArea fx:id="textAreaLength" editable="false" layoutX="13.0" layoutY="187.0" prefHeight="40.0" prefWidth="200.0" /> <Label layoutX="13.0" layoutY="314.0" prefHeight="27.0" prefWidth="207.0" text="Зустріч з найбільшою кількістю" /> <TextArea fx:id="textAreaMax" editable="false" layoutX="13.0" layoutY="358.0" prefHeight="40.0" prefWidth="200.0" /> <Label layoutX="14.0" layoutY="341.0" text="учасників" /> <Label layoutX="14.0" layoutY="244.0" text="Середня кількість учасників" /> <TextArea fx:id="textAreaAverage" editable="false" layoutX="13.0" layoutY="261.0" prefHeight="40.0" prefWidth="200.0" /> <Button layoutX="57.0" layoutY="138.0" mnemonicParsing="false" onAction="#doWork" prefHeight="25.0" prefWidth="113.0" text="Підрахувати" /> </children> </AnchorPane> </left> <center> <TableView fx:id="tableViewMeetings" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> <columns> <TableColumn fx:id="tableColumnPlace" editable="false" prefWidth="90.0" text="Місце" /> <TableColumn fx:id="tableColumnDate" prefWidth="76.0" text="Дата" /> <TableColumn fx:id="tableColumnNum" prefWidth="134.0" text="Кількість учасників" /> <TableColumn fx:id="tableColumnTopic" minWidth="0.0" prefWidth="228.0" text="Тема зустрічі" /> </columns> </TableView> </center> </BorderPane>
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д