Работа с 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>