Работа с XML-файлами - Java

Узнай цену своей работы

Формулировка задачи:

Суть задания: пользователь может редактировать табличные данные, сохранить и загружать в XML. У меня же выбивает кучу исключений, открывает только созданный мною XML, не позволяет создавать новый документ и не дает редактировать данные. MeetingsController.java
Листинг программы
  1. package application;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.net.URL;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.ResourceBundle;
  8. import javax.xml.bind.JAXBException;
  9. import lab.src.pack.*;
  10. import graph.*;
  11. import javafx.fxml.FXML;
  12. import javafx.fxml.Initializable;
  13. import javafx.scene.control.Alert;
  14. import javafx.scene.control.TableColumn.CellEditEvent;
  15. import javafx.scene.control.Label;
  16. import javafx.scene.control.TextField;
  17. import javafx.scene.control.TextArea;
  18. import javafx.scene.control.TableView;
  19. import javafx.scene.control.TableColumn;
  20. import javafx.scene.control.Alert.AlertType;
  21. import javafx.scene.control.cell.PropertyValueFactory;
  22. import javafx.scene.control.cell.TextFieldTableCell;
  23. import javafx.stage.FileChooser;
  24. import javafx.util.converter.DoubleStringConverter;
  25. import javafx.util.converter.IntegerStringConverter;
  26. import javafx.application.Platform;
  27. import javafx.collections.FXCollections;
  28. import javafx.collections.ObservableList;
  29. import javafx.event.ActionEvent;
  30. public class MeetingsController implements Initializable{
  31. private XMLConference conference = new XMLConference();
  32. private ObservableList<Meeting> observableList;
  33. public static void showMessage (String message){
  34. Alert alert = new Alert (AlertType.INFORMATION);
  35. alert.setTitle("");
  36. alert.setHeaderText(message);
  37. alert.showAndWait();
  38. }
  39. public static void showError (String message){
  40. Alert alert = new Alert (AlertType.ERROR);
  41. alert.setTitle("Помилка");
  42. alert.setHeaderText(message);
  43. alert.showAndWait();
  44. }
  45. public static FileChooser getFileChooser(String title) {
  46. FileChooser fileChooser = new FileChooser();
  47. fileChooser.setInitialDirectory(new File("."));
  48. fileChooser.getExtensionFilters().add(
  49. new FileChooser.ExtensionFilter("XML-файли (*.xml)", "*.xml"));
  50. fileChooser.getExtensionFilters().add(
  51. new FileChooser.ExtensionFilter("Усі файли (*.*)", "*.*"));
  52. fileChooser.setTitle(title);
  53. return fileChooser;
  54. }
  55. @FXML TextField textFieldPlace;
  56. @FXML TextField textFieldName;
  57. @FXML TextArea textAreaLength;
  58. @FXML TextArea textAreaAverage;
  59. @FXML TextArea textAreaMax;
  60. @FXML TableView<Meeting> tableViewMeetings;
  61. @FXML TableColumn<Meeting, String> tableColumnPlace;
  62. @FXML TableColumn<Meeting, Double> tableColumnDate;
  63. @FXML TableColumn<Meeting, Integer> tableColumnNum;
  64. @FXML TableColumn<Meeting, String> tableColumnTopic;
  65. @Override
  66. public void initialize(URL location, ResourceBundle resources) {
  67. tableViewMeetings.setPlaceholder(new Label(""));
  68. }
  69. @FXML public void doNew(ActionEvent event) {
  70. conference = new XMLConference();
  71. observableList = null;
  72. textFieldPlace.setText("");
  73. textFieldName.setText("");
  74. textAreaLength.setText("");
  75. textAreaMax.setText("");
  76. textAreaAverage.setText("");
  77. tableViewMeetings.setItems(null);
  78. tableViewMeetings.setPlaceholder(new Label(""));
  79. }
  80. @FXML public void doOpen(ActionEvent event) {
  81. FileChooser fileChooser = getFileChooser("Відкрити XML-файл");
  82. File file;
  83. if ((file = fileChooser.showOpenDialog(null)) !=null){
  84. try{
  85. conference.readFromXML(file.getCanonicalPath());
  86. textFieldPlace.setText(conference.getPlace());
  87. textFieldName.setText(conference.getName());
  88. textAreaLength.setText("");
  89. textAreaMax.setText("");
  90. textAreaAverage.setText("");
  91. tableViewMeetings.setItems(null);
  92. updateTable();
  93. }
  94. catch (IOException e){
  95. showError("Файл не знайдено");
  96. }
  97. catch (JAXBException e){
  98. showError ("Непрвильний формат файлу");
  99. }
  100. }
  101. }
  102. @FXML public void doSave(ActionEvent event) {
  103. FileChooser fileChooser = getFileChooser ("Зберегти XML-файл");
  104. File file;
  105. if ((file = fileChooser.showSaveDialog(null)) != null){
  106. try {
  107. updateSourceData();
  108. conference.writeToXML(file.getCanonicalPath());
  109. showMessage("Результати успішно збережені");
  110. }
  111. catch (Exception e){
  112. showError ("Помилка запису в файл");
  113. }
  114. }
  115. }
  116. @FXML public void doExit(ActionEvent event) {
  117. Platform.exit();
  118. }
  119. @FXML public void doAdd(ActionEvent event) {
  120. if (observableList == null){
  121. updateTable();
  122. }
  123. observableList.add (new Meeting(0, 0, ""));
  124. }
  125. @FXML public void doRemove(ActionEvent event) {
  126. if (observableList == null){
  127. return;
  128. }
  129. if (observableList.size()>0){
  130. observableList.remove(observableList.size() - 1);
  131. }
  132. if (observableList.size() <= 0){
  133. observableList = null;
  134. }
  135. }
  136. @FXML public void doSortByQuantity(ActionEvent event) {
  137. updateSourceData();
  138. conference.sortByQuantity();
  139. updateTable();
  140. }
  141. @FXML public void doSortByAlphabet(ActionEvent event) {
  142. updateSourceData();
  143. conference.sortByAlphabet();
  144. updateTable();
  145. }
  146. @FXML public void doAbout(ActionEvent event) {
  147. Alert alert = new Alert(AlertType.INFORMATION);
  148. alert.setTitle("Про програму...");
  149. alert.setHeaderText("Дані про конференцію");
  150. alert.setContentText("Версія 3.0");
  151. alert.showAndWait();
  152. }
  153. @FXML public void doPlaceChanged (ActionEvent event){
  154. conference.setPlace(textFieldPlace.getText());
  155. }
  156. @FXML public void doWork (ActionEvent event){
  157. updateSourceData();
  158. textAreaMax.setText("");
  159. textAreaLength.setText("");
  160. textAreaAverage.setText("");
  161. Meeting max = conference.getMeeting(0);
  162. for (int i = 0; i < conference.meetingCount(); i++){
  163. Meeting m1 = conference.getMeeting(i);
  164. if (max.getNum() < m1.getNum()){
  165. max = m1;
  166. }
  167. }
  168. showMax(max);
  169. textAreaLength.appendText(conference.NameLength()+" символів.\n");
  170. textAreaAverage.appendText (conference.Average()+"\n");
  171. }
  172. @FXML public void nameChanged (ActionEvent event){
  173. conference.setName(textFieldName.getText());
  174. }
  175.  
  176. private void showMax (Meeting meeting){
  177. textAreaMax.appendText(meeting.getTopic()+"\n");
  178. }
  179. private void updateSourceData(){
  180. conference.clearMeeting();
  181. for (Meeting m : observableList){
  182. conference.addMeeting(m);
  183. }
  184. }
  185. private void updateTopic (CellEditEvent<Meeting, String> t){
  186. Meeting m = (Meeting) t.getTableView().getItems().get(t.getTablePosition().getRow());
  187. m.setTopic(t.getNewValue());
  188. }
  189. private void updateDate (CellEditEvent<Meeting, Double> t){
  190. Meeting m = (Meeting) t.getTableView().getItems().get(t.getTablePosition().getRow());
  191. m.setDate(t.getNewValue());
  192. }
  193. private void updateNum (CellEditEvent<Meeting, Integer> t){
  194. Meeting m = (Meeting) t.getTableView().getItems().get(t.getTablePosition().getRow());
  195. m.setNum(t.getNewValue());
  196. }
  197. private void updateTable(){
  198. List<Meeting> list = new ArrayList<Meeting>();
  199. observableList = FXCollections.observableList(list);
  200. for (int i = 0; i < conference.meetingCount(); i++){
  201. list.add(conference.getMeeting(i));
  202. }
  203. tableViewMeetings.setItems(observableList);
  204. tableColumnPlace.setSortable(false);
  205. conference.setPlace(textFieldPlace.getText());
  206. tableColumnDate.setCellValueFactory(new PropertyValueFactory<>("date"));
  207. tableColumnDate.setCellFactory(TextFieldTableCell.<Meeting, Double>forTableColumn(new DoubleStringConverter()));
  208. tableColumnDate.setOnEditCommit(t -> updateDate(t));
  209. tableColumnNum.setCellValueFactory(new PropertyValueFactory<>("num"));
  210. tableColumnNum.setCellFactory(TextFieldTableCell.<Meeting, Integer>forTableColumn(new IntegerStringConverter()));
  211. tableColumnNum.setOnEditCommit(t -> updateNum(t));
  212. tableColumnTopic.setCellValueFactory(new PropertyValueFactory<>("topic"));
  213. tableColumnTopic.setCellFactory(TextFieldTableCell.forTableColumn());
  214. tableColumnTopic.setOnEditCommit(t -> updateTopic(t));
  215. }
  216. }
XMLConference.java
Листинг программы
  1. package graph;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.util.Collections;
  7. import java.util.Comparator;
  8. import javax.xml.bind.*;
  9. import lab.src.pack.AbstractConference;
  10. import lab.src.pack.Meeting;
  11. import xml.ConferenceData;
  12. import static xml.ConferenceData.MeetingData;
  13. public class XMLConference extends AbstractConference {
  14. private static ConferenceData cd;
  15. @Override
  16. public String getName() {
  17. return cd.getName();
  18. }
  19. @Override
  20. public void setName(String name) {
  21. cd.setName(name);
  22. }
  23. @Override
  24. public String getPlace(){
  25. return cd.getPlace();
  26. }
  27. @Override
  28. public void setPlace (String Place){
  29. cd.setPlace(Place);
  30. }
  31. @Override
  32. public Meeting getMeeting(int i) {
  33. MeetingData data = cd.getMeetingData().get(i);
  34. Meeting meeting = new Meeting (data.getDate(), data.getNum(), data.getTopic());
  35. return meeting;
  36. }
  37. @Override
  38. public void setMeeting(int i, Meeting meeting) {
  39. MeetingData data = new MeetingData();
  40. data.setDate(meeting.getDate());
  41. data.setNum(meeting.getNum());
  42. data.setTopic(meeting.getTopic());
  43. cd.getMeetingData().set(i, data);
  44. }
  45. @Override
  46. public int meetingCount() {
  47. return cd.getMeetingData().size();
  48. }
  49. @Override
  50. public void addMeeting(Meeting meeting) {
  51. MeetingData data = new MeetingData();
  52. data.setDate(meeting.getDate());
  53. data.setNum(meeting.getNum());
  54. data.setTopic(meeting.getTopic());
  55. cd.getMeetingData().add(data);
  56. }
  57. @Override
  58. public void clearMeeting() {
  59. cd.getMeetingData().clear();
  60. }
  61. @Override
  62. public void sortByQuantity() {
  63. Collections.sort(cd.getMeetingData(), new Comparator<MeetingData>(){
  64. public int compare (MeetingData m1, MeetingData m2){
  65. return Double.compare(m1.getNum(), m2.getNum());
  66. }
  67. });
  68. }
  69. @Override
  70. public void sortByAlphabet() {
  71. Collections.sort(cd.getMeetingData(), new Comparator<MeetingData>(){
  72. public int compare(MeetingData m1, MeetingData m2){
  73. return m1.getTopic().compareTo(m2.toString());
  74. }
  75. });
  76. }
  77. public static void readFromXML(String fileName) throws JAXBException, FileNotFoundException {
  78. JAXBContext jaxbContext = JAXBContext.newInstance("xml");
  79. Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  80. cd = (xml.ConferenceData) unmarshaller.unmarshal(new FileInputStream(fileName));
  81. }
  82. public static void writeToXML(String fileName) throws JAXBException, IOException {
  83. JAXBContext jaxbContext = JAXBContext.newInstance("xml");
  84. Marshaller marshaller = jaxbContext.createMarshaller();
  85. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
  86. marshaller.marshal(cd, new FileWriter(fileName));
  87. }
  88. protected void test() {
  89. try {
  90. readFromXML("src/xml/Conference.xml");
  91. showData("Вихідні дані:");
  92. System.out.println("Зустріч з найбільшою кількістю учасників: " + MaxMeet());
  93. sortByQuantity();
  94. showData("Сортування за кількістю учасників:");
  95. sortByAlphabet();
  96. showData("Сортування за алфавітом тем:");
  97. writeToXML("src/xml/ByComments.xml");
  98. readFromXML("src/xml/ByComments.xml");
  99. }
  100. catch (Exception ex) {
  101. ex.printStackTrace();
  102. }
  103. }
  104. public static void main(String[] args) {
  105. new XMLConference().test();
  106. }
  107. }

Решение задачи: «Работа с XML-файлами»

textual
Листинг программы
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <?import java.lang.*?>
  4. <?import javafx.scene.control.*?>
  5. <?import javafx.scene.layout.*?>
  6. <?import javafx.scene.layout.BorderPane?>
  7.  
  8. <BorderPane prefHeight="453.0" prefWidth="749.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MeetingsController">
  9.    <top>
  10.       <MenuBar prefHeight="25.0" prefWidth="6837.0" BorderPane.alignment="CENTER">
  11.         <menus>
  12.           <Menu mnemonicParsing="false" text="Файл">
  13.             <items>
  14.               <MenuItem mnemonicParsing="false" onAction="#doNew" text="Новий" />
  15.                   <MenuItem mnemonicParsing="false" onAction="#doOpen" text="Відкрити..." />
  16.                   <MenuItem mnemonicParsing="false" onAction="#doSave" text="Зберегти..." />
  17.                   <SeparatorMenuItem mnemonicParsing="false" />
  18.                   <MenuItem mnemonicParsing="false" onAction="#doExit" text="Вийти" />
  19.             </items>
  20.           </Menu>
  21.           <Menu mnemonicParsing="false" text="Редагування">
  22.             <items>
  23.               <MenuItem mnemonicParsing="false" onAction="#doAdd" text="Додати рядок" />
  24.                   <MenuItem mnemonicParsing="false" onAction="#doRemove" text="Видалити останній рядок" />
  25.             </items>
  26.           </Menu>
  27.           <Menu mnemonicParsing="false" text="Робота">
  28.             <items>
  29.               <MenuItem mnemonicParsing="false" onAction="#doSortByQuantity" text="Сортування за кількістю учасників" />
  30.                   <MenuItem mnemonicParsing="false" onAction="#doSortByAlphabet" text="Сортування за алфавітом тем" />
  31.             </items>
  32.           </Menu>
  33.             <Menu mnemonicParsing="false" text="Допомога">
  34.               <items>
  35.                 <MenuItem mnemonicParsing="false" onAction="#doAbout" text="Про програму..." />
  36.               </items>
  37.             </Menu>
  38.         </menus>
  39.       </MenuBar>
  40.    </top>
  41.    <left>
  42.       <AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
  43.          <children>
  44.             <Label layoutX="14.0" layoutY="27.0" text="Місце проведення конференції" />
  45.             <TextField fx:id="textFieldPlace" layoutX="13.0" layoutY="44.0" onAction="#doPlaceChanged" prefHeight="25.0" prefWidth="200.0" />
  46.             <Label layoutX="13.0" layoutY="83.0" text="Назва конференції" />
  47.             <TextField fx:id="textFieldName" layoutX="13.0" layoutY="100.0" prefHeight="25.0" prefWidth="200.0" />
  48.             <Label layoutX="13.0" layoutY="170.0" text="Довжина назви конференції" />
  49.             <TextArea fx:id="textAreaLength" editable="false" layoutX="13.0" layoutY="187.0" prefHeight="40.0" prefWidth="200.0" />
  50.             <Label layoutX="13.0" layoutY="314.0" prefHeight="27.0" prefWidth="207.0" text="Зустріч з найбільшою кількістю" />
  51.             <TextArea fx:id="textAreaMax" editable="false" layoutX="13.0" layoutY="358.0" prefHeight="40.0" prefWidth="200.0" />
  52.             <Label layoutX="14.0" layoutY="341.0" text="учасників" />
  53.             <Label layoutX="14.0" layoutY="244.0" text="Середня кількість учасників" />
  54.             <TextArea fx:id="textAreaAverage" editable="false" layoutX="13.0" layoutY="261.0" prefHeight="40.0" prefWidth="200.0" />
  55.             <Button layoutX="57.0" layoutY="138.0" mnemonicParsing="false" onAction="#doWork" prefHeight="25.0" prefWidth="113.0" text="Підрахувати" />
  56.          </children>
  57.       </AnchorPane>
  58.    </left>
  59.    <center>
  60.       <TableView fx:id="tableViewMeetings" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
  61.         <columns>
  62.           <TableColumn fx:id="tableColumnPlace" editable="false" prefWidth="90.0" text="Місце" />
  63.           <TableColumn fx:id="tableColumnDate" prefWidth="76.0" text="Дата" />
  64.             <TableColumn fx:id="tableColumnNum" prefWidth="134.0" text="Кількість учасників" />
  65.             <TableColumn fx:id="tableColumnTopic" minWidth="0.0" prefWidth="228.0" text="Тема зустрічі" />
  66.         </columns>
  67.       </TableView>
  68.    </center>
  69. </BorderPane>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут