Работа с 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>
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д