Задание 2 (1 балл)
Описать класс документа с табулированной функцией.
Объект этого класса должен описывать открытый в программе документ, т.е. содержать ссылку на объект табулированной функции, текущее имя файла документа, а также булевский флаг, показывающий то, изменялся ли документ с момента последнего сохранения. Значения последних двух полей должны соответствующим образом изменяться в ходе работы методов класса.
Реализуйте в классе следующие методы, соответствующие действиям с документом, которые может выполнить пользователь:
метод newFunction(double leftX, double rightX, int pointsCount) должен заменять объект табулированной функции на новый с указанными параметрами;
метод saveFunction() должен сохранять текущую табулированную функцию в текстовый файл с текущим именем;
метод saveFunctionAs(String fileName) должен сохранять текущую табулированную функцию в текстовый файл с указанным именем;
метод loadFunction(String fileName) должен загружать из файла с указанным именем табулированную функцию;
метод tabulateFunction(Function function, double leftX, double rightX, int pointsCount) должен заменять объект табулированной функции на новый, полученный путём табулирования указанной функции с указанными параметрами.
При написании этих методов воспользуйтесь методами класса TabulatedFunctions.
Определите в классе два доступных только для чтения булевских свойства modified и fileNameAssigned, показывающих, соответственно, изменялся ли документ с последнего сохранения и назначено ли для документа имя файла.
Чтобы предоставить возможность работы с хранящейся табулированной функцией, а также обеспечить отслеживание изменений, вместо предоставления прямого доступа к объекту функции поступим следующим образом. Пусть класс документа сам реализует интерфейс TabulatedFunction и содержит реализации всех методов этого интерфейса. Но вместо действительной реализации этих методов (такой, какая была в классах ArrayTabulatedFunction и LinkedListTabulatedFunction) в них просто будут вызываться методы объекта табулированной функции, хранящейся в документе. Т.е. объект документа, вместо того, чтобы самому, например, вычислять значение функции, будет заставлять это делать хранящийся в документе объект табулированной функции.
Таким образом, требуется реализовать все методы из интерфейса TabulatedFunction, а также переопределить методы из класса Object так, чтобы для реального выполнения действия вызывались методы объекта хранящейся в документе табулированной функции. Исключениями будут являться методы equals() и clone() (подумайте, почему это так, и реализуйте методы корректно). В методах, которые меняют функцию, нужно ещё и изменять значение поля, показывающего, что документ изменялся.
Задание 3 (1 балл)
Для работы компонента типа JTable (а именно он будет использоваться для вывода и редактирования табулированной функции) необходима так называемая модель таблицы, т.е. специальный объект, хранящий данные таблицы и описывающий то, как с этими данными таблица может работать. Классы таких объектов должны реализовывать интерфейс TableModel. Однако часто оказывается проще унаследовать свой класс модели от класса DefaultTableModel и изменить только те особенности поведения, которые нужно.
Опишите свой класс модели для таблицы, содержащий конструктор и ряд описанных ниже методов.
Конструктор этого класса должен принимать и сохранять в полях объекта два параметра. Первый из них должен иметь тип TabulatedFunction и являться ссылкой на объект табулированной функции, данные из которой выводятся и редактируются в таблице. Второй должен иметь тип Component и являться ссылкой на родительский компонент, относительно которого должны выводиться сообщения об ошибках.
Метод int getRowCount() должен возвращать количество строк в таблице. Очевидно, что оно совпадает с количеством точек в табулированной функции.
Метод int getColumnCount() должен возвращать количество столбцов в таблице.
Метод String getColumnName(int index) должен возвращать заголовок столбца таблицы по его номеру.
Метод Class getColumnClass(int index) должен возвращать ссылку на рефлексивное описание типа объектов, которые выводятся в указанном столбце таблицы. Поскольку в таблицу будут выводиться числа, возвращать этот метод должен значение Double.class.
Метод boolean isCellEditable(int rowIndex, int columnIndex) должен возвращать логическое значение, показывающее, можно ли редактировать значение в ячейке с указанными координатами.
Метод Object getValueAt(int rowIndex, int columnIndex) должен возвращать объект, значение которого выводится в ячейку с указанными координатами. Здесь этими значениями являются абсциссы и ординаты точек табулированной функции.
Метод void setValueAt(Object value, int rowIndex, int columnIndex) должен изменять значение в табулированной функции. Первый его параметр – новое значение, второй и третий – координаты ячейки таблицы, в которой произошло изменение значения. В случае если значение некорректно, следует вывести на экран сообщение об ошибке с помощью метода JOptionPane.showMessage() (здесь пригодится второй параметр конструктора класса модели таблицы).
