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

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

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

Суть задания: пользователь может редактировать табличные данные, сохранить и загружать в XML. У меня же выбивает кучу исключений, открывает только созданный мною XML, не позволяет создавать новый документ и не дает редактировать данные. MeetingsController.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));
        }
}
XMLConference.java
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>

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


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

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

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