Створення на мові програмування Java аплету, реалізуючого інтерфейс Gnumeric.org Gnumeric Spreadsheet

 














КУРСОВИЙ ПРОЕКТ

Створення на мові програмування Java аплету, реалізуючого інтерфейс Gnumeric.org Gnumeric Spreadsheet


Вступ

алгоритм програма windows

Задачу було реалізовано засобами обєктно-орієнтованої мови Java, інтерфейс програми Gnumeric. Таблиці Gnumeric є частиною середовища робочого столу GNOME: Проект по створенню вільної, зручної робочої середовища. Побудована обєктна модель та здійснення реалізація відповідного застосування та аплету. Під час створення роботи були вивчені аспекти створення контекстного меню, підменю, створення спливаючих розділів, діалогових вікон, кнопок різного призначення, визначена сфера застосування програми. Були поглиблені теоретичні знання з Java, а також з дисциплін обєктно-орієнтованого програмування, основ редакторів по роботі з таблицями. Мова Java сильно вплинула і навіть змінила обличчя Internet, розширивши спектр обєктів, які можуть розповсюджуватись у Internet-просторі. Програми нової форми - аплети - завантажуються з віддаленого сервера і можуть запускатися динамічно, без участі користувача. До появи Java такий підхід був неприпустимий з міркувань безпеки. В архітектурі аплетів зроблено ряд штучних обмежень, які роблять їх цілком безпечними. Перш за все, Java є інтерпретованою мовою і простір ресурсів Java-програми обмежений так званою віртуальною Java-машиною (VJM). JVM - це Java Virtual Machine, віртуальна машина Java, інтерпретуюча байт-код, описуваний в class - файлах. Її застосування необхідно для забезпечення кросс - платформенності, а також для безпеки, однак створює деякі проблеми в питанні продуктивності, вона може контролювати поведінку програми і захищати систему від побічних ефектів, які можуть виникати з вини аплета. Аплети - це програми, працюючі у середі іншої програми - браузера. Вони не потребують вікно вищого рівня - ним служить вікно браузера. Вони не запускаються JVM - їх завантажує браузер, який сам запускає JVM для виконання аплету. Ці особливості відображаються на написанні програми. Аплети дозволяють виконувати складну локальну обробку даних, отриманих від сервера Web або введених користувачем із клавіатури. З міркувань безпеки аплети (на відміну від звичайних додатків Java) не мають ніякого доступу до файлової системи локального комп'ютера. Для підвищення продуктивності додатків Java у сучасних браузерах використається компіляція «на лету» - Just-In-Time compilation (JIT). При першому завантаженні аплета його код транслюється у звичайну здійсненну програму, що зберігається на диску й запускається. У результаті загальна швидкість виконання аплета Java збільшується в кілька разів. У Java синтаксис близький до синтаксису мови C++. Успадкувавши найкраще від мови програмування C++, мова Java при цьому позбулася деяких недоліків C++, у результаті чого на ній стало простіше програмувати. У цій мові нема, наприклад, покажчиків, які складні у використанні й потенційно можуть послужити причиною доступу програми до не приналежній їй області пам'яті. Немає множинного спадкування й шаблонів, хоча функціональні можливості мови Java від цього не постраждали. В результаті був сформований ясний і прагматичний підхід до обєктів. Вільно переймаючи ідеї, які реалізовувалися протягом останніх десятиріч, мові Java вдалося знайти рівновагу між парадигмою «все є обєктом» і прагматичним підходом. Обєктна модель Java проста і легко розширюється, в той час як просі типи, як цілі, зберігаються як дані, що не є обєктами, що дозволяє значно підвищити швидкість при їх обробці. Java дозволяє створювати незалежні від платформи програми шляхом компіляції в проміжне представлення, яке називається байт кодом. Багато попередніх спроб знати розвязок проблеми незалежності від платформи були зроблені за рахунок продуктивності. Крім того в Java наявний засіб передачі повідомлень в межах внутрішнього адресного простору. Це дозволяє забезпечити віддалене виконання процедур. Ці інтерфейси включені у пакет RMI (Remote Method Invocation).


1. Постановка задачі


На мові програмування Java створити аплет, який моделює інтерфейс та роботу програмної системи Gnumeric Spreadsheet (http // :www.gnumeric.org). З функціями роботи з клітинами електронної таблиці до яких входять: вибір шрифту, його розмір та його начертання (жирний, курсив, звичайний). Додатково реалізуються елементи меню «Сервіс» - «Статистичний аналіз» - «Описові статистики «(«Tools» - «Statistical analysis» - «Descriptive Statistics»). Вивчити аспекти виконання методів, використання класів та роботи з обєктами, визначити сферу застосування даної мови програмування. Зробити вибір методів та інструментальних засобів для здійснення необхідних функцій та виклику процедур. Поглибити теоретичні знання з багатьох дисциплін, отримати практичні навички роботи з Java. Детальніше про індивідуальне завдання:

Описова статистика (Descriptive statistics) - один з розділів статистичної науки, в рамках якого вивчаються методи опису і представлення основних властивостей даних. Дозволяє узагальнювати первинні результати, отримані при спостереженні або в експерименті. Застосування описової статистики включає наступні етапи:

а) Збір даних

б) Категоризація даних

в) Узагальнення даних

г) Представлення даних

Для більш глибоких висновків про природу аналізованих даних використовується індуктивна статистика.У рамках описової статистики застосовуються такі найпростіші техніки:

а) Графічне представлення даних.

б) Табличне представлення даних.

в) Використання узагальнюючих статистик, таких як ранг, медіана, дисперсія і т.д. Узагальнюючі статистики використовуються для вирішення двох основних завдань:

) Показати загальне в характері сукупності даних.2) Показати, у чому і наскільки дані різні.

При узагальненні кількісних величин, таких, як довжина, вага або вік, для вирішення першого завдання найчастіше застосовуються середнє арифметичне, медіана чи мода, якщо розподіл унімодальному. Використовуються так само квантів - числові характеристики функції розподілу. Для вирішення другого завдання застосовують такі заходи неоднорідності даних, як дисперсія, квадратний корінь з дисперсії - стандартне, стандартна похибка середнього.

Дана програма здатна вираховувати:

а) Середнє арифметичне;

б) Медіану;

в) Мінімальне значення;

г) Максимальне значення;

д) Суму;

е) Ранг.

Середнім арифметичним числа є частка від ділення суми цих чисел на їх кількість;

Медіана (англ. median) - величина ознаки, що знаходиться по середині ранжованного ряду вибірки, тобто - це величина, що знаходиться в середині ряду величин, розташованих у зростаючому або спадному порядку.

Мінімальним значенням є найменше число із всіх введених користувачем.

Максимальне значення є найбільше число із всіх введених користувачем.

Сума - сума всіх чисел введених користувачем.

Ранг - різниця між найбільшим та найменшим числом, введеним користувачем.

Пояснення коду програми який безпосередньо реалізує вищеперераховані дії відбувається в кінці опису алгоритму.

Чому саме Gnumeric Spreadsheet?

Програмна система Gnumeric Spreadsheet є безкоштовною, доступною для загального огляду програми, котра за своїми функціями дуже схожа на всесвітньо відому програму по роботі з таблицями та розрахунками Excel, котра входить до складу пакету Microsoft office. Gnumeric Spreadsheet дає великі можливості для роботи з таблицями та розрахунків за допомоги них, опанувавши принципи роботи Gnumeric Spreadsheet, ви з легкістю зможете користуватися і Excel.


2. Розробка програми


2.1 Опис алгоритму


Програма реалізована в середовищі Java, за прототип було взято програмну систему Gnumeric Spreadsheet (http // :www.gnumeric.org). Для реалізація було залучено такі бібліотеки:

а) import javax.swing.*;

б) import javax.swing.event.*;

в) import java.awt.*;

г) import java.awt.event.*;

Класи, які надають всі компоненти Swing містяться в пакеті java.swing.*, модифікатори містяться в пакеті java.awt.*, методи які дозволяють отримувати та оброблювати події, входять в інтерфейси, які містяться в пакетах javax.swing.event.*, java.awt.event.*;.Всі використані класи продемонстровано у таблиці 2.1 «Використані класи».


Таблиця 2.1 «Використані класи»

JSpinnerJButtonJTableJFileChooserJToggleButtonJTabbedPaneJComboBoxJScrollPaneJMenuBarIntegerJMenuButtonGroupJMenuItemFontJAppletJToolBarJSeparatorJDialog

2.2 Опис програми


Розглянемо детальніше блоки програми та функції, які вони виконують.

Розпочнемо з перших рядків програми:

import javax.swing.*;javax.swing.event.*;javax.swing.table. AbstractTableModel;javax.swing.table. DefaultTableCellRenderer;javax.swing.table. TableColumn;java.awt.*;java.awt.event.*;

import java.util. Arrays;

В цих рядках описані бібліотеки які залучені вході виконання програми.

В бібліотеці «javax.swing» знаходяться майже всі компоненти які ми використовуємо, мова йде про кнопки (JButton, JToggleButton), інкрементний регулятор (JSpinner), таблицю (JTable), компоненти списку (JComboBox), компоненти створення головного меню програми (JMenuBar), компоненти реалізації контекстного меню (JMenu, JMenuItem), для створення аплету який використовує компоненти swing (JApplet), компонент для розділу пунктів меню (JSeparator), діалогове вікно (JFileChooser), вкладки (JTabbedPane), компонент для реалізації користувацького графічного інтерфейсу (JScrollPane), та компоненти панелі інструментів (JToolBar), діалогове вікно, яке використовується підчас індивідуального завдання (JDialog).

В бібліотеках «javax.swing.event», «java.awt.event» знаходяться методи які дозволяють отримувати та оброблювати події. Бібліотека «java.util. Arrays» вміщує в себе функції по роботі з масивом (знадобиться під час сортування масиву в індивідуальному завданні). Всі інші слугують як помічники для реалізації, одного з головних класів - таблиці.

Після оголошення бібліотек йде оголошення класу, «public class Gnumeric extends JFrame implements ActionListener» це головний клас (який вступає в прямий контакт с користувачем), до якого має змогу звернутись користувач, він повинен бути оголошений як public, далі йде назва класу, ключове слово «extends» задає батьківський клас новому створюваному класу(JFrame) можемо для реалізації використовувати компоненти Swing, «implements ActionListener» дає змогу зрозуміти що клас реалізує інтерфейс ActionListener (подія дії (событие действия)).

Далі описані допоміжні елементи, які оголошуються в самому початку, оскільки у подальшому ході виконання програми буде вимагатися їх поява у функціях (методах):

-В рядку «String [] Tomb = {«Dialog», «Serif», «Times New Roman», «Cambria», «monospaced»};» оголошено масив рядків, в якому йде перелік назв шрифтів.

-В змінній «int fontSize = 14» вказується початковий розмір шрифту, у подальшому, при примсі користувача розмір шрифту може змінюватись, а отже і значення в цій змінній.

Змінна «String item» буде зберігати вибраний користувачем шрифт (жирний, курсив, звичайний).

Зміна «String CopyPaste» зберігає значення комірки, значення якої ми прагнемо скопіювати, або вирізати.

Також тут оголошено два масиви посилань в динамічній памяті для таблиць (по чотири, оскільки програма має чотири незалежні таблиці в чотирьох вкладках (одна з яких для індивідуального завдання)), «JTable [] jtab = new JTable [4]» створює безпосередньо посилання на таблицю, а «JScrollPane [] jscrlp = new JScrollPane[4]» слугує для створення полос прокрутки для цих таблиць (шляхом вставлення таблиці в панель).

В масиві змінних під назвою «ImageIcon imgs[]», в цьому масиві будуть зберігатися завантажені зображення.

Створюється ще декілька змінних, про їх використання буде описано під час ініціалізації.

Після оголошення змінних описується конструктор «public Gnumeric()» в якому відбувається виклик функції «initialization()» в якій вже безпосередньо виконується ініціалізація програми. Першим кроком на шляху ініціалізації програми є встановлення розмірів вікна при старті програми в пікселях. Саме це і відбувається в рядку «setSize (900,600)». Після чого описується яку дію необхідно виконати при закритті програми, в даному випадку програма завершає своє виконання на що вказує рядок: «setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE)». Потім відбувається ініціалізація змінних які містять зображення, завантаження та присвоєння цим змінним. Все це відбувається у рядках:

ImageIcon[] innerImgs = new ImageIcon[27];(int i = 0; i < 27; i++) {[i] = new ImageIcon((i + 1) +».gif»);

}

У подальшому ці змінні буду використовувати при створенні елементів до яких треба підставити зображення.

Потім створюється головне меню програми «JMenuBar jmb = new JMenuBar()», яке завжди буде на виду, під час ходу виконання всієї програми. JMenuBar є своєрідний контейнер для меню. Подібно іншим компонентам він є підкласом класу JComponent, для данного классу є лише один конструктор, по умовчанню. Такий новий рядок меню порожній, і перед використанням треба заповнити конкретними пунктами. В програмі може бути лише один рядок меню. В класі JMenuBar визначено декілька методів, при створенні програми знадобиться лише один з них - add(), цей метод звязує з рядком меню обєкт JMenu(підменю).

Наступним кроком буде створення компонентів реалізації підменю, на сам перед мова йде про створення підрозділів, нижче наведено перелік підрозділів:

JMenu jmFile = new JMenu («File»);

JMenu jmEdit = new JMenu («Edit»);

JMenu jmView = new JMenu («View»);

JMenu jmInsert = new JMenu («Insert»);

JMenu jmFormat = new JMenu («Format»);

JMenu jmTools = new JMenu («Tools»);

JMenu jmData = new JMenu («Data»);

JMenu jmHelp = new JMenu («Help»);

Для кожного з цих підрозділів виконані наступні дії:

а) Задано мнемонічні клавіші,

Продемонструємо їх налаштування на прикладі підменю («File»):

«jmFile.setMnemonic (KeyEvent.VK_F)»

як бачимо з рядка вище для налаштування мнемонічних клавіш використовуються метод «setMnemonic» завдяки команді «KeyEvent.VK_F» задається клавіша «F».Тепер якщо натиснути клавішу «alt» то під написом File буде підкреслено клавішу при натисненні на яку, при умові зажатої клавіші alt буде виконуватись вибір підрозділу, в цьому випадку при комбінації «alt + F» генерується натиснення кнопки («File»), виклик проходить без обліку регістра.

Аналогічні дію будуть виконуватись для всіх підрозділів.

б) Створено пункти які будуть знаходитись в составі підменю. (для кожного підменю свої):

JMenu інкапсулює меню, котре заповнюється пунктами, реалізованими за допомогою обєктів JMenuItem. Клас JMenu є дочірнім по відношенню до класу JMenuItem. Це означає, що є можливість звязувати з іншим обєктом того ж типу, можливо створювати підменю в составі меню. При створенні програми знадобиться один метод і для JMenu - add(), цей метод звязує з підменю обєкт JMenuItem або ще JMenu(підменю). Для деяких елементів JMenuItem створені також зображення які відображаються зліва від імені елемента. Отже, при створенні кожний елемент JMenuItem має своє імя яке зображене в дужках, а деякі і зображення, змінна в якій зберігається зображення розміщується з права від імені.

Перелік створених елементів для кожного з підменю, продемонстровано нижче.

Опис підменю під назвою «jmFile»:

Елементи підменю «jmFile» зображені у таблиці 2.2 «JMenu jmFile («File»)».


Таблиця 2.2 «JMenu jmFile («File»)»

Елемент (JMenuItem)JMenuItem jmiNew = new JMenuItem («New», innerImgs[14]);JMenuItem jmiOpen = new JMenuItem («Open», innerImgs[17]);JMenuItem jmiClose = new JMenuItem («Close»);JMenuItem jmiSave = new JMenuItem («Save», innerImgs[23]);JMenuItem jmiSaveAs = new JMenuItem («Save as», innerImgs[23]);JMenuItem jmiSaveWP = new JMenuItem («Save as Web Page», innerImgs[24]);JMenuItem jmiSaveWS = new JMenuItem («Save workspace»);JMenuItem jmiSaveSearch = new JMenuItem («File search», innerImgs[25]);JMenuItem jmiPrev = new JMenuItem («Preview Page»);JMenuItem jmiPrint = new JMenuItem («Print», innerImgs[20]);JMenuItem jmiExit = new JMenuItem («Exit», KeyEvent.VK_E);

Для деяких елементів створено обробники подій, тобто при натисненні на вибраний компонент відбувається подія. В інтерфейсі ActionListener є метод, який викликається лише тоді, коли користувач натискає на кнопці, або виконує іншу дію яка впливає на цей компонент. Ця подія може бути опрацьована будь-яким обєктом, при умові, що він реалізую інтерфейс ActionListener. Звязування кнопки з обробником відбувається наступним чином, нижче приведені два способи реалізації:

а) Для кожної дії можливо визначити окремий обробник, таким чином різні класи будуть підтримувати різні події, тобто реалізовувати обробник подій за допомогою неіменованих внутрішніх класів (обробляти подію одразу при звязуванні клавіші з обробником події, такий метод використовують, коли для реалізації даної події використовується лише одна клавіша), саме цей метод використовується для елементу підменю («Exit»):

«jmiExit.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_E, InputEvent.CTRL_MASK));

jmiExit.addActionListener (new ActionListener() {void actionPerformed (ActionEvent ae) {.exit(0);

}

});»

В цьому випадку використовується неіменований внутрішній клас, який реалізує інтерфейс ActionListener. Викликається метод «actionPerformed», в якому вказано, що при виклику (натисненні на цій елементі) повинна виконуватись команда «System.exit(0)», яка виконує вихід з програми.

б) Але можливий й інший варіант, коли використовується один обробник, а саме екземпляру цього класу. (такий метод використовують коли декілька клавіш виконують одну й ту ж саму дію, це робить заради того щоб уникнути дублювання коду.) Цей метод використовується для клавіш «Open», «Close».

jmiOpen.addActionListener(this); // імя команди дії по

умовчанню («Open»)

jmiSave.addActionListener(this); // імя команди дії по

умовчанню («Save»)

В цих рядках вказується, що з цими двома клавішами звязується обробник подій дії «this» вказує на те, що події передаються для обробки екземпляру цього класу. Опис обробки подій, звязаних з цими методами буде описана пізніше, оскільки ту ж само дію будуть виконувати й інші клавіші.

Розпізнавання яка сама подія спричинила виклик тої чи іншої дії, відбувається завдяки команді дії, за умовчанням яка має назву ту, яка написана на тій клавіші (елементі) який спричинив виклик, існує метод «setActionCommant», який дає змогу змінити імя команди, або задати його, наприклад якщо не використовувалося імя, а ідентифікатором будо зображення.

В нашому випадку це не потрібно адже нас саме цікавить це імя для команди дії. І навмисно для декількох елементів (клавіш) буде заданий один і той же ідентифікатором, щоб не дублювати код. Як і для підрозділів, для деяких пунктів створено мнемонічні клавіші. Але вагомою різницею є наступний рядок, завдяки команді «setAccelerator» відбувається налаштування комбінацій клавіш, рядок «KeyStroke.getKeyStroke» вказує на те, що буде відбуватися присвоєння комбінації, «KeyEvent.VK_E» як і при простому мнемонічній операції вказує на літеру яку треба натиснути для імітації натиснення клавіші, «InputEvent.CTRL_MASK» вказує на яку сумісну клавішу треба натиснути щоб викликати дію. На відміну від звичайного виклику мнемонічної клавіші (за допомого «alt») відтепер при одночасному натисненні цих двох клавіш буде викликана саме ця дія (в цьому випадку Exit).

Після обяви, ініціалізації (в деяких випадках як з Exit і реалізації) треба внести всі елементи до складу підменю («File»), це робиться завдяки методу add() який описав раніше, код який безпосередньо виконує це написаний нижче:

jmFile.add(jmiNew); // Додання елементів до підменю файлів

jmFile.add(jmiOpen);.add(jmiClose);.addSeparator();.add(jmiSave);.add(jmiSaveAs);.add(jmiSaveWP);.add(jmiSaveWS);.add(jmiSaveSearch);.addSeparator();.add(jmiPrev);.add(jmiPrint);.addSeparator();.add(jmiExit);

Всі елементи будуть відображатись в підменю («File») в порядку їх внесення відтак першим буде «jmiNew» а останній «jmiExit». Як вже було сказано раніше

JSeparator це компонент для розділу пунктів меню. Він в більшій мірі використовується для більш упорядкованого розміщення елементів (наприклад по категоріям), це роблять для зручності користувача, адже для того щоб користувач обрав саме цю програму, вона повинна мати зручний та гарний інтерфейс.

Опис підменю під назвою «jmEdit»:

Елементи підменю «jmEdit» зображені у таблиці 2.3 «JMenu jmEdit («Edit»)».


Таблиця 2.3 «JMenu jmEdit («Edit»)»

Елемент (JMenuItem)JMenuItem jmiCancel = new JMenuItem («Cansel»);JMenuItem jmiReturn = new JMenuItem («Return»);JMenuItem jmiCut = new JMenuItem («Cut»);JMenuItem jmiCopy = new JMenuItem («Copy»);jmiPaste = new JMenuItem («Paste»);JMenuItem jmiPasteSpecial = new JMenuItem («Paste Special»);JMenuItem jmiIH = new JMenuItem («Insert as a hyperlink»);JMenu jmFill = new JMenu («Fill»);JMenuItem jmiDown = new JMenuItem («Down»);JMenuItem jmiRight = new JMenuItem («Right»);JMenuItem jmiUp = new JMenuItem («Up»);JMenuItem jmiLeft = new JMenuItem («Left»);JMenu jmClear = new JMenu («Clear»);JMenuItem jmiAll = new JMenuItem («All»);JMenuItem jmiFormat = new JMenuItem («Format»);JMenuItem jmiСontent = new JMenuItem («Сontent»);JMenuItem jmiNotes = new JMenuItem («Notes»);JMenuItem jmiDeletel = new JMenuItem («Delete»);JMenuItem jmiDeleteList = new JMenuItem («Delete list»);JMenuItem jmiMoveCopy = new JMenuItem («Move / Copy Sheet»);JMenuItem jmiFind = new JMenuItem («Find»);JMenuItem jmiReplace = new JMenuItem («Replace»);JMenuItem jmiContinue = new JMenuItem («Continue»);

Як і раніше, для найважливіших елементів задані мнемонічні операції. Побачити які саме для якої клавіші можливо при затисненні клавіші «Alt». А комбінації швидкого доступу будуть показані з права від назви елементу.

Створені наступні обробники подій (подія - натискання на елемент.

Звязані наступні елементи з обробником екземпляру цього класу:

jmiCut.addActionListener(this); // імя команди дії по умовчанню

(«Cut»)

jmiCopy.addActionListener(this); // імя команди дії по

умовчанню («Copy»)

jmiPaste.addActionListener(this); // імя команди дії по

умовчанню («Paste»)

тобто використовується один обробник, а саме екземпляру цього класу. Цей обробник використовується для клавіш «Cut», «Copy», «Paste».

Видимість елементу по умовчанню є істинна (true) тобто елемент є видимий і його можливо використовувати, якщо ж ми хочемо зробити його не доступним треба використати метод «setEnabled(false)» саме значення в дужках і вирішує чи доступний елемент. В цьому випадку обрано «false» тобто елемент не доступний (візуально він буде сірого кольору та тусклий на фоні інших елементів). В цій програмі треба на початку зробити елемент Paste не доступним, адже с початку він не містить ніякого значення саме це робить наступний рядок: «jmiPaste.setEnabled(false)».

Вносимо всі елементи до складу підменю («Edit»), це робиться завдяки методу add() який описав раніше. Оскільки у декількох елементів підменю («Edit»)є свої підменю, то спочатку в ті підменю вносимо їх елементи, а потім вже безпосередньо готові підменю до складу підменю («Edit»). Код який безпосередньо треба вписувати для кожного елементу написаний нижче:

Внесення до підменю («Edit»)

jmEdit.addSeparator();jmEdit.add(jmiFind);.add(jmiCancel);jmEdit.add(jmiReplace);.add(jmiReturn);jmEdit.add(jmiContinue);.addSeparator();Внутрішнє підменю

jmEdit.add(jmiCut);Підменю («Fill»)

jmEdit.add(jmiCopy);jmFill.add(jmiRight);

jmEdit.add(jmiPaste);jmFill.add(jmiUp);

jmFill.add(jmiDown);jmFill.add(jmiLeft);

jmEdit.add(jmiPasteSpecial);Підменю («Cleat»)

jmEdit.add(jmiIH);jmClear.add(jmiFormat);

jmEdit.addSeparator();jmClear.add(jmiNotes);

jmEdit.add(jmFill);jmClear.add(jmiAll);

jmEdit.add(jmiDeletel);jmClear.add(jmiСontent);

jmEdit.add(jmiDeletel);jmEdit.add(jmiMoveCopy);

jmEdit.add(jmiDeleteList);jmEdit.add(jmClear);

Спочатку вносяться елементи до внутрішніх підменю. А вже потім до («Edit»).

Опис підменю під назвою «jmView»:

Елементи підменю «jmView» зображені у таблиці 2.4 «JMenu jmView («View»)».

Таблиця 2.4 «JMenu jmView («View»)»

Елемент (JMenuItem)JMenuItem jmiNormal = new JMenuItem («Normal»);JMenuItem jmiPageLayout = new JMenuItem («Page Layout»);JMenuItem jmiTaskPane = new JMenuItem («Task Pane»);JMenuItem Toolbar = new JMenuItem («Toolbar»);JMenuItem jmiFormulaBar = new JMenuItem («Formula Bar»);JMenuItem StatusBar = new JMenuItem («Status bar»);JMenuItem jmiHeaderFooter = new JMenuItem («Header and Footer…»);JMenuItem jmiNote = new JMenuItem («Notes»);JMenuItem jmiRepresentations = new JMenuItem («Representations…»);JMenuItem jmiFullScreen = new JMenuItem («Full screen»);JMenuItem jmiScale = new JMenuItem («Scale…»);

Як і раніше вносимо всі елементи до складу підменю («View»):

.add(jmiNormal);jmView.addSeparator();.add(jmiPageLayout);jmView.add(jmiFullScreen);

jmView.add(jmiHeaderFooter);jmView.add(jmiFormulaBar);.addSeparator();jmView.add(jmiNote);.add(jmiTaskPane);jmView.addSeparator();.add(Toolbar);jmView.add(StatusBar);

jmView.add(jmiRepresentations);jmView.add(jmiScale);

Опис підменю під назвою «jmHelp»:

Елементи підменю «jmHelp» зображені у таблиці 2.5 «JMenu jmHelp («Help»)».


Таблиця 2.5 «JMenu jmHelp («Help»)»

Елемент (JMenuItem)JMenuItem jmiHelp = new JMenuItem («Help»);Як і раніше задаються мнемонічна клавіша, та клавіша швидкого доступу. Вносимо елемент до складу підменю («Help»): jmHelp.add(jmiHelp);

Опис підменю під назвою «jmInsert»:

Елементи підменю «jmInsert» зображені у таблиці 2.6 «JMenu jmInsert («Insert»)».


Таблиця 2.6 «JMenu jmInsert («Insert»)»

Елемент (JMenuItem)JMenuItem jmiCells= new JMenuItem («Cells…»);JMenuItem jmiLine = new JMenuItem («Line»);JMenuItem jmiColumns = new JMenuItem («Columns»);JMenuItem jmiSheet = new JMenuItem («Sheet»);JMenuItem jmiCharts= new JMenuItem («Charts…»);JMenuItem jmiCharts= new JMenuItem («Charts…»);JMenuItem jmiFunction= new JMenuItem («Function»);JMenu jmFigure = new JMenu («Figure»);JMenuItem jmiPicture= new JMenuItem («Picture…»);JMenuItem jmiFromFile= new JMenuItem («From File…»);JMenuItem jmiCameraScanner= new JMenuItem («With the camera / scanner»);

Внесення елементів:

Внесення до підменю («Insert») jmInsert.addSeparator();.add(jmiCells);jmInsert.add(jmiSymbols);.addSeparator();jmInsert.addSeparator();.add(jmiLine);jmInsert.add(jmiFunction);.addSeparator();jmInsert.addSeparator();.add(jmiColumns);jmInsert.add(jmFigure);.addSeparator();Внутрішнє підменю («Figure»).add(jmiSheet);jmFigure.add(jmiPicture);.addSeparator();jmFigure.add(jmiFromFile);.add(jmiCharts);jmFigure.add(jmiCameraScanner);

Опис підменю під назвою «jmTools»:

Елементи підменю «jmTools» зображені у таблиці 2.7 «JMenu jmTools («Tools»)».


Таблиця 2.7 «JMenu jmTools («Tools»)»

Елемент (JMenuItem)JMenu jmiStatisticalAnalysis = new JMenu («Statistical analysis»);JMenuItem jmiDescriptiveStatistics = new JMenuItem («Descriptive statistics»);

Внесення до підменю («Tools»)

jmTools.add(jmiStatisticalAnalysis);

Внутрішнє підменю («Statistical analysis»).add(jmiDescriptiveStatistics);

Детально про це підменю розповідається пізніше, зараз зауважу лише те що елемент «jmiDescriptiveStatistics» викликає діалогове вікно.

Опис підменю під назвою «jmFormat»:

Елементи підменю «jmFormat» зображені у таблиці 2.8 «JMenu jmFormat («Format»)».


Таблиця 2.8 «JMenu jmFormat («Format»)»

Елемент (JMenuItem)JMenuItem jmiFCells= new JMenuItem («Cells»);JMenu jmFLine = new JMenu («Line»);JMenuItem jmiHeight = new JMenuItem («Height»);JMenuItem jmiAHeight = new JMenuItem («AutoFit height»);JMenuItem jmiHide = new JMenuItem («Hide»);JMenuItem jmiDisplay = new JMenuItem («Display»);JMenu jmFColumns = new JMenu («Columns»);JMenuItem jmiCWidth = new JMenuItem («Width»);JMenuItem jmiCAWidth = new JMenuItem («AutoFit width»);JMenuItem jmiCHide = new JMenuItem («Hide»);JMenuItem jmiCDisplay = new JMenuItem («Display»);JMenu jmFSheet = new JMenu («Sheet»);JMenuItem jmiRename = new JMenuItem («Rename»);JMenuItem jmiSHide = new JMenuItem («Hide»);JMenuItem jmiSDisplay = new JMenuItem («Display»);

Внесення до підменю («Format»)Внутрішнє підменю

jmFormat.add(jmiFCells);Підменю («Line»)

jmFormat.addSeparator();jmFLine.add(jmiHeight);.add(jmFLine);jmFLine.add(jmiHide);

jmFormat.addSeparator();jmFLine.add(jmiDisplay);.add(jmFColumns);Підменю («Columns»)

jmFormat.addSeparator();jmFColumns.add(jmiCWidth);.add(jmFSheet);

jmFColumns.add(jmiCAWidth);

Підменю («Sheet»)jmFColumns.add(jmiCHide);

jmFSheet.add(jmiRename);

jmFColumns.add(jmiCDisplay);

jmFSheet.add(jmiSHide);

jmFSheet.add(jmiSDisplay);

в) Приєднання всіх підменю до головного (JMenuBar)

jmb.add(jmFile);jmb.add(jmFormat);.add(jmEdit);jmb.add(jmTools);.add(jmView);jmb.add(jmData);.add(jmInsert);jmb.add(jmHelp);

Всі елементи будуть відображатись в порядку їх внесення

Наступна частина програми одна з найважливіших, мова йде про таблицю, саме з нею будуть в основному відбуватися дії користувача. Із всіх компонентів вона є самою потужною. В виді таблиць можливо представити самі різноманітні засоби. Інформація зображена в таблицях відображається в комірках. Компоненти JTable не підтримують режим прокрутки, тому таблицю вставлено до складу компонента JScrollPane (оголошений масив ссилок був на початку програми.) Оскільки відбувається створення одразу чотирьох таблиць (існує чотири вкладки, в кожні з яких є окрема таблиця) для зручності (щоб не дублювати код) створено масиви, їх ініціалізація проходить за допомоги циклу.

for (int i = 0; i < 4 i++) {[i] = new JTable (new MarchModel (50,10));column = null;= jtab[i].getColumnModel().getColumn(0);.setPreferredWidth(20);[i].setGridColor (Color.BLACK);[i].setDefaultRenderer (jtab[i].getColumnClass(1), new DefaultTableCellRenderer() {Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {.setHorizontalAlignment (SwingConstants.CENTER);.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);this;

}

});[i].setCellSelectionEnabled(true);

jscrlp[i] = new JScrollPane (jtab[i]);

}

В другому рядку створюється безпосередньо таблиця, існує декілька конструкторів для побудови, які використовують стандартну модель, або модель створену користувачем, для створення користувачем є окремий клас який має назву AbstractTableModel для цієї таблиці була створена спеціальна модель(MarchModel), для створення таблиці також використовується конструктор, який задає необхідну кількість стовпців та рядків (в даному випадку 50 на 10). Наступні два рядки задають розмір першого стовпця (в якому будуть пронумеровані рядки). Після чого, функцією «setGridColor (Color.BLAK)» для кожної таблиці задається колір решітки (для зручності). У 7-17 рядках виконується метод, завдяки якому відбувається вирівнювання по центру. Функція «setCellSelectionEnabled(true)» дозволяє вибирати окремі комірки. І на останок всі таблиці включаються в состав компонента JScrollPane. Заголовки стовпців автоматично відображаються на екрані. Таблиця генерує ряд подій найважливішими для цієї програми є вибір комірок (які вибрані користувачем) (ListSelectionEvent) та подія яка виникає при зміні даних в комірках (TableModelEvent).

Далі створюються вкладки, спеціальний контейнер реалізується класом JTabbedPane (контейнер був оголошений в самому початку «JTabbedPane jtp»). Він керує компонентами, розміщуючи їх «на передній план». Ініціалізація відбувається у рядку «jtp = new JTabbedPane (JTabbedPane.BOTTOM)» JTabbedPane.BOTTOM розміщує ярлики цих вкладок по нижній частині вікна. Далі відбувається приєднання JScrollPane (а разом з нею і таблиці) до контейнера за допомоги метода (addTab).

jtp.addTab («Sheet 1», jscrlp[0]);

jtp.addTab («Sheet 2», jscrlp[1]);

jtp.addTab («Sheet 3», jscrlp[2]);

При приєднанні слід вказати назву ярлика, та безпосередньо обєкт який включаємо, саме це і відбувається в рядках вище.

І на останок відбувається приєднання вкладок до панелі головного контейнера. Це відбувається у рядку «getContentPane().add(jtp)».

Для вибору шрифту використовується список що розкривається, який належить до великої різновидності списків. В складі такого списку присутня активуюча кнопка. Оскільки список розкривається лише коли він необхідний - він ідеально підходить для цієї задачі. Для підтримки списків що розкриваються передбачений клас JComboBox. Його оголошення знаходиться на початку програми а ініціалізація відбувається нижче.

jcbTomb = new JComboBox (Tomb);

jcbTomb.setMaximumSize (new Dimension (200, 20));.setActionCommand («Tomb»); // імя команди дії («Tomb»)

jcbTomb.addActionListener(this);

В першому рядку відбувається безпосередньо створення, як завжди існує декілька конструкторів. В даному випадку використовується конструктор, який створює список що розгортається, містячи пункти, задані за допомогою масива Tomb. Tomb це масив строк який вже описувався раніше (в ньому містяться назви деяких шрифтів). У рядку 4 відбувається звязування обєкта класу JComboBox з обробником екземпляру цього класу. Перед чим у рядку 3 задається імя команди дії для ідентифікації обєкту. (як вже було сказано раніше всі обєкти які ми звязуємо з обробником екземпляру цього класу будуть реалізовуватися в одному методі пізніше). Метод у рядку 2 («setMaximumSize») задає максимальні розміри вікна обєкту JComboBox (за умовчання він розтягнеться на довжину всього рядка).

Наступним кроком є створення регулятора розмірності шрифту, для цього використовується інкрементний регулятор JSpinner, оголошений також у самому початку програми. Для потреб цієї програми серед конструкторів більш за все підходить конструктор, який створює інкрементний регулятор на базі моделі створеної програмістом. Створення моделі відбувається у рядку

«SpinnerNumberModel spm =new SpinnerNumberModel (fontSize, 1,30, 1);»

«fontSize» задає начальне значення, наступна за ним одиниця вказує на крок з яким відбувається прирощення, число 30 вказує на максимальне число, яке буде доступне, остання цифра 1 на мінімальне.В рядку «jspin = new JSpinner(spm)» відбувається створення обєкту JSpinner який використовує підготовлену раніше модель spm. Установка бажаних розмірів інкрементного регулятора відбувається у рядку: «jspin.setPreferredSize (new Dimension (60, 20))».

Далі за допомоги окремого обробника, тобі ж обробника створеного за допомогою неіменованого внутрішнього класу, відбувається обробки події при зміні значення інкрименту.

jspin.addChangeListener (new ChangeListener() {void stateChanged (ChangeEvent ce) {bSize = (Integer) jspin.getValue();= bSize;

jbtn.doClick();

}

});

А саме при зміні значення регулятора відбувається присвоєння вибраного значеня змінній fontSize, а в кінці обробника подій імітується натиснення на кнопку яка викликає обробник подій дії класу (саме той який використовують всі обєкти, тобто загальний) а вже безпосередньо в ньому відбувається зміна шрифту.

Слідкуючим кроком буде створення панелі інструментів, компоненту який надає можливість альтернативного способу звернення до функцій, доступних за допомогою меню. Панель інструментів містить набор кнопок, які дозволяють використовувати різні функції, в цьому випадку на цій панелі містяться:

Кнопки: створення нового документу («New»), відкриття документу («Open»), зберігання документу («Save»), печаті («Print»), вирізання тексту в комірці («Cut»), копіювання тексту («Copy»), вставки тексту («Paste»), переходу на крок на зад («Cancel»), переходу на крок вперед («Return»), кнопки вибору шрифту (жирний («FontBold»), курсив («FontItalic»), звичайний («FontPlain»)), функції, а також регулятор розмірності шрифту та список вибору шрифту.

Спочатку створюється сама панель у рядку «JToolBar jtb = new JToolBar («Debug»)» Потім створюються кнопки які будуть входити в состав панелі, для їхнього зображення в програмі використовуються зображення:

JButton jbtnNew = new JButton (innerImgs[14]);jbtnOpen = new JButton (innerImgs[17]);jbtnSave = new JButton (innerImgs[23]);jbtnPrint = new JButton (innerImgs[20]);jbtnCut = new JButton (innerImgs[4]);jbtnCopy = new JButton (innerImgs[3]);= new JButton (innerImgs[19]);.setEnabled(false);jbtnCancel = new JButton (innerImgs[0]);jbtnReturn = new JButton (innerImgs[21]);

JButton jbtnFun = new JButton (innerImgs[11]);= new JToggleButton (innerImgs[7]);= new JToggleButton (innerImgs[8]);= new JToggleButton (innerImgs[9], true);

Всі кнопки одразу доступні для вибору за виключенням вставки (Paste). Далі відбувається включення деяких кнопок в групу

ButtonGroup bg = new ButtonGroup();

bg.add(jtbFontBold);

bg.add(jtbFontItalic);

bg.add(jtbFontPlain);

У першому рядку відбувається створення групи, а нижче до нього додаються компоненти (кнопки які треба обєднати.).

Це зроблено тому що одночасно може бути використана лише одна кнопка, мова йде про вибір шрифту, саме для нього використовується кнопка-перемикач, яка дозволяє бачити який саме шрифт (жирний, курсив чи звичайний) вибраний в даний момент. За умовчанням вибирається шрифт звичайний, на що вказує допоміжне слово «true».

Для деякі кнопки звязуються з обробником екземпляру цього класу, оскільки ініціалізація усіх кнопок відбувалась за допомоги зображень, для кожної кнопки треба задати команду дії, про яку згадувалося раніше:

jbtnNew.setActionCommand («New»);.setActionCommand («Open»);.setActionCommand («Save»);.setActionCommand («Print»);.setActionCommand («Cut»);.setActionCommand («Copy»);.setActionCommand («Paste»);.setActionCommand («Cancel»);.setActionCommand («Return»);.setActionCommand («Fun»);

jtbFontBold.setActionCommand («FontBold»);.setActionCommand («FontItalic»);.setActionCommand («FontPlain»);

Безпосереднє звязування з обробником подій:.addActionListener(this); // імя команди дії («Open»)

jbtnSave.addActionListener(this); // імя команди дії («Save»)

jbtnCut.addActionListener(this); // імя команди дії («Cut»)

jbtnCopy.addActionListener(this); // імя команди дії («Copy»)

jbtnPaste.addActionListener(this); // імя команди дії («Paste»)

jbtnFun.addActionListener(this); // імя команди дії («Fun»)

jtbFontBold.addActionListener(this); // імя команди дії

(«FontBold»)

jtbFontItalic.addActionListener(this); // імя команди дії

(«FontItalic»)

jtbFontPlain.addActionListener(this); // імя команди дії

(«FontPlain»)

Останнім кроком є включення всіх кнопок в состав панелі інструментів:

jtb.add(jbtnNew);jtb.add(jbtnCancel);.add(jbtnOpen);jtb.add(jbtnReturn);.add(jbtnSave);jtb.addSeparator();.addSeparator();jtb.add(jtbFontBold);.add(jbtnPrint);jtb.add(jtbFontItalic);

jtb.addSeparator();jtb.add(jtbFontPlain);

jtb.add(jbtnCut);jtb.add(jcbTomb);

jtb.add(jbtnCopy);jtb.add(jspin);

jtb.add(jbtnPaste);jtb.add(jbtnFun);

jtb.addSeparator();

Наступною задачею є створення діалогового вікна його оголошення також відбувається на початку програми, в ході ініціалізації графічного інтерфейсу відбувається його створення «jfc = new JFileChooser()», робота з вікнами дещо відрізняється, вона нагадує метод, для виклику якого потрібна інша кнопка яка і активує, це відбувається в методі обробки екземпляру цього класу.

В кінці відбувається приєднання меню та панелі інструментів до аплету. Панель інструментів, як і раніше вкладки приєднуються до панелі аплета, «getContentPane().add(jfc)», а ось меню приєднується безпосередньо до самого аплета (контейнера верхнього рівня) «setJMenuBar(jmb)». На цьому метод «initialization ()» завершується, наступним кроком слід описати реалізацію метода обробки подій цього класу (обробник екземпляру цього класу). Цей метод має назву «actionPerformed», свою роботу цей метод розпочинає з визначення в якій вкладці була виконана дія саме це робить цей рядок «Q = jtp.getSelectedIndex()» в цьому рядку передається номер вкладки змінній «Q», після чого вже буде відомо до якого елементу масиву таблиці слід звертатися. Далі створюються дві змінні «row» і «col» в них буде зберігатися дані з яким рядом і яким стовпчиком виконується дія. І ось тепер безпосередньо починається опис необхідних дій в залежності від того яка кнопка була нажата (дія зроблена).

В рядку «if (ae.getActionCommand().equals («Tomb»))» виконується перевірка чи дію спричинив обєкт імя команди якого є «Tomb», якщо так то вибране значення записується в змінну «item, «item = (String) jcbTomb.getSelectedItem()» (зміна вибору шрифту виконається в ході цього метода, оскільки для зміни розміру шрифту, його начертання та виду відповідає один метод, саме тому при реалізації раніше обробки дії зміни розміру шрифту імітувався виклик цього методу. Як і розмір шрифту заносився в змінну «fontSize» так и тут імя шрифту вноситься змінну «item», в дію всі зміни приходять під час реалізації начертання шрифту, оскільки він завжди виконується (дані розміру шрифту та його назви записуються в окремі змінні тому що інакше при кожній зміні окремо якогось з трьох елементів виникав би конфлікт (разом з одним змінювались й всі інші, навіть якщо це і не потрібно)). Далі виконується перевірка який саме вид начертання шрифту вибрано

if (jtbFontBold.isSelected())

if (jtbFontItalic.isSelected())

if (jtbFontPlain.isSelected())

В залежності від чого змінюється начертання шрифту (якщо це необхідно), а разом із ним якщо було проведено якісь зміни розміру шрифту, його виду то вони вступають в силу.

В рядку:(ae.getActionCommand().equals («Copy»)||

ae.getActionCommand().equals («Cut»))

робиться перевірка чи подію спричинив один з обєктів імя якого «Copy» чи «Cut» якщо ж це підтверджується то в першу чергу активізується кнопка вставки (стає доступною) це виконується в рядках:

jmiPaste.setEnabled(true);.setEnabled(true)

Наступним кроком є визначення який стовпчик та рядок спричинили подію і поміщення цих даних відповідно в змінні «row» і «col», = jtab[Q].getSelectedRow(); = jtab[Q].getSelectedColumn()

І на останок значення комірки по цим координат копіюється в строку «CopyPaste»:

CopyPaste = (String) jtab[Q].getValueAt (row, col);

Після чого знову робиться перевірка чи подію спричинив саме обєкт з імям «Cut» якщо ж це дійсно так, то після копії елемента значення комірки стає порожнім:(ae.getActionCommand().equals («Cut»))[Q].setValueAt («», row, col);

В рядку:(ae.getActionCommand().equals («Paste»))

перевіряється чи подію спричинив обєкт з імям «Paste» і якщо це підтверджується то знову визначається який стовпчик та рядок спричинили подію і ці дані зносяться відповідно в змінні «row» і «col». І вже по цим даним копіюється значення зі змінної «CopyPaste», «jtab[Q].setValueAt (CopyPaste, row, col)».

В рядках:

if (ae.getActionCommand().equals («Open»))

та(ae.getActionCommand().equals («Save»))

перевіряється чи подію спричинив обєкт з імям «Open» або «Save» і якщо це підтверджується в залежності від підтвердження відкривається діалогове вікно для відкриття файлу або ж для збереження відповідно, jfc.showOpenDialog(null);.showSaveDialog(null)

Наступний метод є дуже важливий, бо без нього не буде працювати програма, цей метод має назву main().

public static void main (String args[]) {.invokeLater (new Runnable() {void run() {Gnumeric().setVisible(true);

}

});

}

Для того щоб код, підтримуючий інтерфейс, міг бути створений в потоці обробки подій, треба використовувати один з двох методів, певних в класі «SwingUtilities: invokeLater() и invokeAndWait()». «InvokeLater» одразу повертає управління викликаючому методу, а це саме те що нам потрібно. Заголовок «InvokeLater» має вигляд: «static void invokeLater (Runnable obj)» де «obj» - це обєкт «Runnable», метод «run ()» котрого викликається в потоці обробки дії. И наостанок створюємо та забезпечуємо відображення вікна:

Gnumeric().setVisible(true);

Додатковий клас

Модель таблиці яка була спеціально створена для цієї програми, та використана при формуванні таблиці описана нижче.Перш за все спочатку йде оголошення класу, як вже було сказано раніше для цього необхідний окремий клас який має назву «AbstractTableModel».

Оголошення: «class MarchModel extends AbstractTableModel». Далі створюються дві змінні в яких у подальшому будуть поміщатися значення необхідної розмірності таблиці це «numRows» та «numCols». Далі оголошено два масиви в першому будуть зберігатися імена стовпців (масив строк), а в другому дані комірок (масив обєктів), це масиви «colNames» та «data» відповідно. Далі створюється конструктор, конструктор потребує введення двох значень які заносяться в «numRows» та «numCols». Далі створюється масив строк, розмірності якого дорівнює кількості колонок тут будуть зберігатися заголовки стовпців. Далі відбувається формування імен стовпців за допомоги циклу, код який це робить продемонстрований нижче:

for (int i = 0; i < cols; i++) {(i == 0) colNames[i] = «#»;{

int a = i-1+'A';[] b= new char [1];

b[0] = (char) a;

colNames[i] = new String(b);

}

Як видно з коду першому стовпцю присвоюється символ «#». А для всіх інших формується порядковий номер в виді літери. Після того як заголовки були створені слідкуючим етапом є заповнення таблиці порожніми значеннями. Перед чим спочатку створюється масив з розмірністю відповідною до кількості стовпців та рядків. Заповнення порожніми значеннями показано в циклі нижче:

for (int i = 0; i < len; i ++)

for (int j = 0; j < cols; j++) {(j == 0) data[i] [j] = i+1;

else data[i] [j] = «»;

}

}

Далі відбувається створення декількох важливих методів для класу:Спочатку реалізуються методи які при необхідності повертаю значення кількості стовпців та рядків, потім метод який повертає значення імені стовпця, для виклику метода треба вказати який саме стовпчик цікавить. Далі відбувається створення вкрай важливого методів для цієї програми які повертають значення яке міститься в координатах, координати задає користувач. А другий не менш важливий метод задає значення в координатах які задає користувач. І на останок створюється метод в якому описується до яких комірок користувач має доступ, відтак комірки, за допомогою яких відбувається нумерування комірок недоступні.

Індивідуальне завдання

Моїм індивідуальним завданням є створення описових статистик (Descriptive Statistic). Для виконання всіх розрахунків і дій над елементами я використав створений мною клас під назвою «ObrobElEntered», який в свою чергу є підкласом іншого мого класу який має назву «DescriptiveStatisticsDialog».

Клас «ObrobElEntered»

Спочатку опишу підклас.

Слово «private» має на увазі що цей клас доступний лише класу, підкласом якого він є. Клас має наступні змінні:

-int Q = jtp.getSelectedIndex();

Ця змінна отримує номер активної вкладки (вкладка для якої треба зробити описові статистики.

-int [] sCol = jtab[Q].getSelectedColumns();

Масив який містить номери всіх вибраних колонок.

-int [] sRow = jtab[Q].getSelectedRows();

Масив який містить номери всіх вибраних столбцов.

-int kolvo = (sCol.length) * (sRow.length);

Зміна яка містить кількість вибраних комірок.

-int dlin = sRow.length;

Зміна яка містить кількість вибраних столбцов.

-int[] MassEl = new int [kolvo];

Масив який буде вміщати в себе всі введені єлементи.

-int numberOfElements;

Зміна яка містить кількість комірок зі значенням (кол-во елементів массиву).

-int sum;

Зміна яка містить суму всіх елементів масиву.

Також клас має 5 методів:

а) Можливо навіть сказати що перший метод є найважливішим, оскільки без

нього всі інші перестануть працювати цей метод має назву getMass ();

private int [] getMass () {j = 0, b =0, array=0;(int i = 0; i < kolvo; i++) {str = (String) jtab[Q].getValueAt (sRow[j], sCol[b]);

if (str!= «») {+=1;[array] = Integer.parseInt(str);

array++;

}++;(j == dlin) {++b; j=0;}

}.sort(MassEl);MassEl;

}

В першому рядку можно побачити після завершення функції, вона буде повертати масив типу integer. Що ж до описання безпосередньо дій:

Створюються три додаткові локальні змінні:

j - вказує з яким номером стовпця слід зараз працювати;

b - вказує з яким номером масиву «sCol» слід працювати;

array - вказує в який елемент по рахунку треба вставляти число;

Далі строюється масив який перебирає всі вибрані елементи отримані від користувача. Кожний елемент по черзі перероблюється в строку, після чого відбувається перевірка чи не я ця комірка пустою, якщо ж умова здійснюється і вона не пуста то виконуються наступні дії, по-перше додасться одиниця до двох змінних, по-друге це число із строки переводиться до типу integer і заноситься в масив. Після чого навіть якщо комірка і пуста відбуваються дії: по-перше до змінної додається одиниця, після чого робиться перевірка чи не всі елементи стовпця були оброблені, якщо це дійсно так то переходимо до наступного. Після завершення циклу масив відсортується і функція його поверне (на цьому її робота завершилась).

б) Другий метод знаходить медіану чисел введених користувачем:

public double getMedian () {(numberOfElements == 2) return (float) (MassEl[0] + MassEl[1])/2;{(numberOfElements% 2 == 0)(float) (MassEl[(int) numberOfElements/2-1] + MassEl[(int) numberOfElements/2])/2;return MassEl[(int) numberOfElements/2];

}

}

Цей метод повертає число з плавучою крапкою.

Метод починає з того що порівнює кількість елементів масиву з числом 2, и якщо це дійсно так і масив має лише два значення то він одразу знаходить медіану від двох чисел та повертає її. Якщо ж перша умова хибна то робиться інша перевірка, чи є кількість елементів масиву парним числом (ділиться на два без остачі).Якщо умова виконується то він знаходить медіану шляхом знаходження двох середніх елементів сумує їх та після цього ще й ділить на два і повертає це число. Якщо ця умова хибна - знаходить середнє число та повертає його.

в) Третій метод знаходить суму чисел введених користувачем

Повертає ціле число.

Для знаходження суми чисел прибирає масив за допомоги циклу та сумує всі значення масиву після цього функція повертає це значення.

г) Четверта функція знаходить середнє арифметичне

Повертає число з плавучою крапкою.

Для знаходження середнього арифметичного функція викликає іншу функцію, яка знаходить суму усіх чисел, після чого результат ділить на кол-во елементів масиву та приводить це число до типу з плавучою точкою і на останок функція повертає результат (число з плавучою крапкою).

д) Остання пята функція знаходить ранг

Бере останній елемент масиву та віднімає від нього перший, а результат повертає. (масив відсортований)

Клас «DescriptiveStatisticsDialog»

Як і раніше слово «private» має на увазі що цей клас доступний лише класу, підкласом якого він є. Ключевое слово extends задает родительский класс новому создаваемому классу(JDialog). Цей клас використовується для створення діалогового вікна. Обєкт цього вікна був оголошений ще на початку програми («DescriptiveStatisticsDialog dialog;»). Робота з обєктом цього класу відбувається наступним чином: При натиснення на кнопку на панелі інстуменів («малюнок із зображення англійської літери «F»), або в меню вікна за шляхом: («Tools» - «Statistical analysis» - «Descriptive Statistics»).

При натисненні на одну з цих кнопок виконуються наступні дії:

Перш за все відбувається перевірка чи вперше використовується це вікно (if (dialog == null)) якщо ж ця інформація підтверджується то ініціалізується новий обєкт цього класу. Після чого вже не зважаючи на цю умову у будь-якому випадку запускається метод цього класу («dialog. Input_Output_Range();»).

Опис безпосередньо класу:

Для того щоб реалізувати необхідне вікно, слід створити клас, похідний від класу JDialog («DescriptiveStatisticsDialog extends JDialog»). В Конструкторі даного класу треба вказати фрейм в якому воно повинне створюватись («public DescriptiveStatisticsDialog (JFrame owner)»). А вже в конструкторі треба описувати усі необхідні дії для створення інтерфейсу діалогового вікна. Першим кроком є надання параметрів діалогу, а саме власника, назву діалогового вікна, та помітити чи є воно модальним всі ці дії робить рядок:

super (owner, «Descriptive Statistics», true);

Завершуємо ввід параметрів введенням необхідних розмірів цього діалогового вікна («setSize (500, 300);»). Далі слід завантажити необхідні зображення для деяких кнопок в даному випадку для кнопок («Ok, Cancel, Help»). Що і роблять наступні рядки:

ImageIcon Ok = new ImageIcon («28.gif»);

ImageIcon Help = new ImageIcon («29.gif»);Cansel = new ImageIcon («30.gif»);

Оскільки в класі використовуються вкладки слід свторити спеціальний компонент по роботі з ними:

JTabbedPane jtpD = new JTabbedPane (JTabbedPane.TOP);

після чого описаним вже методом задати його розміри. В діалозі використовуються три вкладки, як вже відмічав раніше для того щоб помістити на вкладку більше ніж один елемент треба скористатись елементом JPanel, який поміщується в цю вкладку, а в саму JPanel вже поміщуються всі необхідні елементи на цій вкладці. Оскільки вкладок три то і компоненті JPanel повинно бути три, їх я створюю за допомогою циклу. Потім по черзі починаю заповнювати ці вкладки, використовуючи для цього компоновку під назвою «Box».

Кожний рядок створюю окремо, для цього виконується ряд наступних дій:

а) Створюються всі необхідні компоненти такі як текстові поля(JTextField), метки (JLabel), кнопки та все інше, при необхідності групіруються (яким чино описував раніше).

б) При необхідності створюються обробники подій для елементів

в) Створюється горизонтальний блок, в який треба помістити всі елементи, для створення необхідних відстань між кнопками використовуються розпірки (в яких вказується на яку саме відстань треба відступити) та склейки які автоматично переходять в кінець рядка.

г) Після того як створили всі необхідні рядки які присутні на цій вкладці створюємо вертикальний блок в який поміщаємо всі горизонтальні блоки. Після цього цей вертикальний блок додаємо до відповідного цій вкладці елементу JPanel. И наостанок додаємо цю панель до вкладки, одночасно створюючи її та задаючи їй назву.

Всі вище перераховані дії слід виконувати для всіх необхідних вкладок.

Після цього створюю всі додаткові кнопки такі як («Ok, Cansel, Help»). До кожної з яких створюю свій обробник подій. При натисненні на кнопку («Ok») викликається метод: OutputDescriptiveStatistics(), та діалогове вікно стає невидимим. При натисненні на кнопку («Cansel»), робиться лише одна дія - вікно стає невидимим. Після цих дій всі три кнопки компонуються за допомоги компоновки під назвою («Box»). И на останок створюється вертикальний елемент компоновки «Box» в який поміщається обєкт з вкладками, після чого робиться склейка, і додасться на останок горизонтальний рядок з кнопками, це робиться для того щоб всі ці три останні кнопки були доступні під час всієї роботи з діалоговим вікном. Після чого цей компонент додається до складу фрейму.

Але на цьому можливості класу не закінчуються також ще він має два метода:

а) «Input_Output_Range ()», Викликається ще при виклику діалогового вікна.

Його задачею є поміщення вибраних комір у текстові поля, які демонструють які елементи були вибрані. Та якщо елементів у рядку більше ніж один то він створює обєкт класу який описувався раніше, слугуючий для обчислень та створення масиву чисел введених значень, одразу створюючи цей масив.

б) «OutputDescriptiveStatistics ()», створює обєкт класу, призначений для

розрахунків, перевіряє чи вибрано умову при якій результат буде відображений у окремій вкладці, якщо це дійсно так то вказує що роботу треба проводити у таблиці під номером три, та додає вкладку з цією таблицею в головне вікно. И звичайно заповнює таблицю необхідними значеннями створюючи тестові поля з написом дії та викликаючи відповідні функції спец класу, які повертають необхідні результати та заносить їх у комірки.


2.3Керівництво системного програміста


Загальні відомості

Програмне забезпечення вимагає для виконання Java runtime environment (JRE) або Java Development Kit (JDK) з javaw.exe. Якщо не встановлений маршрут для javaw.exe, з'явиться діалогове вікно з повідомленням про відсутність JRE/JDK. В JDK входять пакетні програми для компіляції вихідних текстів додатків Java, віртуальна машина, програма автоматизованого створення документації по класах, довідник по класах Java й інші необхідні засоби.

Таблиці Gnumeric є частиною середовища робочого столу GNOME: Проект по створенню вільної, зручної робочої середовища. Метою Gnumeric є створення найкращої таблиці. Gnumeric може читати файли, збережені при роботі з іншими таблицями, і при роботі з цією таблицею буде мінімум неприємностей щодо несумісності з іншими. Головними перевагами цієї таблиці є те що вона безкоштовна, швидка, точна. Вона спроможна створювати великі таблиці, дозволяючи користувачеві її редагувати вразі необхідності. Програма має багато функцій та інструментів які виділяють її з поміж інших своєю точністю. Gnumeric схожий на Microsoft Excel і функціональності цих редакторів приблизно однакова. Програма зможе розраховувати суми по стовпцям та рядкам, брати проценти, порахувати середнє арифметичне, дисперсію, в ній можливе використовування багатьох стандартних функцій - фінансових, математичних, логічних та статистичних. Для ведення домашньої бухгалтерії програма теж підходить. Оформлення таблиць можливе найрізноманітніше, можливо форматування комірок, як в доброму текстовому редакторі можливо змінювати шрифт, начертання, виділяти рядки стовпці, або незалежні комірки тексту кольором шрифту, фоновим кольором, рамочками, будувати по табличним даним графіки і діаграми, розміщати в таблиці зображення та безліч інших корисних речей.

Особливості запуску програми в Linux

Для цього нам знадобляться ресурси інтернету. Необхідні файли ми можемо отримати 2-мя способами: підключитися до репозиторію Дебиана non-free?, завантажити на свій компютер наступні файли:

sun-java5-bin_1.5.0-10-3_i386.deb

sun-java5-jre_1.5.0-10-3_all.deb

sun-java5-plugin_1.5.0-10-3_i386.deb

Якщо є підключення до інтернету, и можливість завантажувати звідти пакети, то тоді вся установка виконується в 3 команди с консолі:

(виконуємо все від суперкористувача)

# echo deb #"justify"># apt-get update

# apt-get install sun-java5-bin_1.5.0-10-3_i386.deb sun-java5-jre_1.5.0-10-3_all.deb sun-java5-plugin_1.5.0-10-3_i386.deb

Якщо ми отримали файли на компютері (наприклад, в директорію /home/vasya/), тоді:

Попередньо слід встановити наступні пакети, (якщо вони вже є, то система вам просто про це повідомить та продовжить роботу):

#apt-get install unixodbc java-common

Далее устанавливаем java, предварительно зайдя в директорию с пакетами:

# cd /home/dmytro

# dpkg - i sun-java5-bin_1.5.0-10-3_i386.deb sun-java5-jre_1.5.0-10-3_all.deb sun-java5-plugin_1.5.0-10-3_i386.deb

Для java-программы мы в консоли, находясь в каталоге с этой программой выполняем (уже от пользователя):

$ javac - Gnumeric. java

$ java - Gnumeric. Java

Особливості запуску програми в FreeBSD

Спочатку треба також встановити java на FreeBSD дотримуючись підказок програми. Потім треба зайти до папки bin і помістити до неї файл програми. Відкомпілювати і запустити його.

Особливості запуску програми в Windows

Для запуску даної програми необхідно щоб була встановлена віртуальна машина Java, яка має назву JDK (Java Devolpers Kit) від фіми Sun. Ця програма не входить до стандартної комплектації операційної системи Windows, якщо ж ця програма в вас вже є - переходьте до кроку 2, якщо ж вона відсутня то треба зробити ряд наступних дій:

Крок 1: Оскільки дана програма вже присутня на цьому диску, то вам потрібно повернутись на головне меню диска (корінь), там ви побачите файл під назвою «jdk-6u25-windows-i586.exe».Натисніть на цей обєкт правою кнопкою миші та виберіть в меню «Відкрити». Після цього слід вибрати місце слідуючи інструкціям в меню установки слід встановити дану програму.

Крок 2: Тепер слід вказати місце знаходження бібліотек та компілятора JDC. Для цього виконуємо наступні дії:

а) Натискаємо на кнопку в лівому нижньому кутку екрану, натискаючи на кнопку «Пуск»;

б) Потім натискаємо правою кнопкою миші на елемент під назвою «Компютер»;

в) Вибираємо підменю під назвою «Свойства»;

г) У з'явившемуся вікні вибираємо підменю «Додаткові параметри системи»;

д) На вкладці «Додаткові вибираємо підменю «Змінні середи», у з'явившемуся вікні виконуємо наступні дії:

) У вікні «Змінні середи користувача» вибираємо змінну «CLASSPATH» та натискаємо кнопку змінити, переходимо в кінець рядка значення змінної, ставимо спочатку знак»;», а після цього».». Якщо ж змінної «CLASSPATH» не має то замість кнопки «Змінити» натискаємо «Створити» в рядок імя змінної вводи CLASSPATH, а в рядок значення змінної ставимо».». Натискаємо «ОК».

) У вікні «Системні змінні» знаходимо змінну «Path» та натискаємо змінити.

) Переходимо в кінець рядка «Значення змінної» ставимо»;» та після цього вказуємо шлях до компілятора, якщо при установці JDK ви не вибирали інший шлях то вводимо рядок:

«C:\Program Files\Java\jdc.1.6.0_25\bin». Після цього натискаємо на кнопку «ОК».

е) Натискаємо на кнопку «OK».

Крок 3: Запуск програми виконуємо через командну строку («Пуск -> Всі програми -> Стандартні -> Командний рядок»)

Після виклику командної строки вказуємо шлях до директорії в якій лежить файл «Gnumeric.java». Для зручності можемо скопіювати папку Gnumeric з диску до папки з іменем користувача компютера.

Якщо скопіювали папку за порадою то в командні строчці вводимо «cd Gnumeric».Натискаємо «Enter».

Після того як вказали шлях до файлу робимо наступні дії:

a) у консольному вікні вводимо «javac Gnumeric.java», натискаємо «Enter»;

б) у консольному вікні вводимо «java Gnumeric», натискаємо «Enter»;

Якщо ви всі вищеперераховані дії виконали правильно програма почне свою роботу.



3. Результати тестування програми


Програма перевірялася за допомоги Eclipse, та за допомоги стандартного компілятора від Java. Під час компіляції помилок та попереджень не виникало, всі компоненти завантажились без проблем. Під час тестування програма показала те, що від неї очікували, а саме було побудовано графічний інтерфейс. Зверху як і було задумано відображається меню, всі елементи впорядковані згідно їх приєднання до головного меню (JMenuBar), підменю з їх елементами також працюють та відображаються коректно, завантаження зображень відбулося вдало, а тому поряд з деякими елементами відображаються їх зображення. Мнемонічні кнопки теж працюють. Панель інструменті працює також добре, починаю з коректно відображеними зображення і закінчуючи вдалим присвоєнням командних імен (кнопки роблять події які повинні). Таблиця реалізована і працю згідно поставлених цілей, отже модель створена правильно, внесення даних в комірки відбувається коректно (перший рядок є недоступним для користувача), вкладки та панелі прокрутки працюють належним чином. Всі функції починаючи з зміни виду шрифту, розміру, начертання і закінчуючи відкриттям та закриттям діалогових вікон працюють. При виклику діалогу, який створен саме для виконання індивідуального завдання все також працює добре, текстові поля в яких вказується діапазон введених комірок теж працює правильно. Після того як відмів необхідні нам аспекти відображення результатів виконання та натиснення кнопки «Ok» в залежності від вибраних умов робиться коректний підрахунок мого індивідуального завдання. Отож в цілому інтерфейс вийшов схожий на поставлений прототип. Аплет швидко виконує команди, задачі, процедури. Витрачено мінімум системних ресурсів ПК при роботі з програмою.



Висновки


Мова програмування Java максимально спрощує процес програмування. Ця мова дозволяє легко, зручно та за невеликий інтервал часу написати надійну та швидкодіючу програму. При цьому Java виконує насправді важкі функції, мова йде про платформо-незалежні програми, динамічну зміну коду та навіть безпеку. Для створення безпосередньо аплетів є надзвичайно легкий та зручний елемент, його назва Swing. Ця віконна підсистема увібрала всі найкращі якості свого попередника (AWT), та додала декілька інноваційних введень, а саме легковагові компоненти та налаштовуванні стилі. Також Java добре підтримує національні абетки, оскільки розроблялася для інтернаціональної мережі Internet. Ця обставина теж є важливою рисою в умовах України. Таким чином Java дозволила достатньо легко за короткий проміжок часу побудувати інтерфейс програми Gnumeric, хоч він і дуже віддалений від оригіналу. При цьому при створені була задіяна дуже мала частина від можливостей Java swing. Звичайно Swing має свої переваги та недоліки, елементи користувацького інтерфейсу бібліотеки Swing виникають на екрані набагато повільніше, ніж компоненти, передбачені в бібліотеці AWT. Однак на сучасних машинах це практично неможливо замітити. З іншої сторони в бібліотеки Swing є декілька важливих переваг.

-Вона містить більше багатий і більш зручний набір елементів користувацького інтерфейсу

-Ця бібліотека набагато менше залежить від платформи, на якій буде виконуватись програма. Отже, вона містить менше помилок, характерних для окремої платформи.

Бібліотека Swing дає можливість користувачам працювати на різних платформах.

Все це означає, що бібліотека Swing в кінці кінців дозволяє виконувати обіцяне компанії Sun: «Написано одного разу, працює всюди!».

Наступна перевага бібліотеки Swing може стати також і її недоліком: якщо елементи користувацького інтерфейсу на різних платформах виглядають однаково, то (на деяких платформах) вони будуть обовязково відрізнятися від її власних компонентів, тобто користувачі будуть в них гірше розбиратися. В бібліотеці Swing і на цей аспект є елегантне рішення. Програмісти, які користуються бібліотекою Swing, можуть придати своїй програмі зовнішній вид в заданому стилі.

Отже, бібліотека Swing більш надійна, функціональна та незалежна, ніж бібліотека AWT. Крім того, її легше використовувати, ніж компоненти користувацького інтерфейсу із бібліотека AWT. Врахувавши все сказане раніше треба відмітити що Java є одним з найпотужніших мов програмування які існують у нас час, і хоч на початку він і був задуманий для інших цілей (з самого початку для приставок) після чого знайшов своє покликання для роботи в інтернеті, зараз використовується для великої кількості цілей, починаючи з програмування для інтернету (аплети) і закінчуючи незалежними Java - програмами.


Список використаної літератури


1.Баклан І.В. Основи програмування на Java - К.: НАУ 2007,244 с.

2.Bruce Eckel.» Thinking in Java».-4th ed. 2006.

3.Herbert Schildt,» Swing: Beginners Guide»: McGraw-Hill/Osborne 2007.

.#"justify">Додаток


Текст програми

java.awt. BorderLayout;java.awt. Color;java.awt. Component;java.awt. Dimension;java.awt. Font;java.awt. GraphicsEnvironment;java.awt.event. ActionEvent;java.awt.event. ActionListener;java.awt.event. InputEvent;java.awt.event. KeyEvent;java.awt.print. PrinterJob;java.util. Arrays;

javax.swing.*;javax.swing.event. ChangeEvent;javax.swing.event. ChangeListener;javax.swing.filechooser. FileNameExtensionFilter;javax.swing.table. AbstractTableModel;javax.swing.table. DefaultTableCellRenderer;javax.swing.table. TableColumn;javax.swing.border.*;

class Gnumeric implements ActionListener {

ccp; // copy cut paste buffer

/*Размер шрифта*/fontSize = 14;jspFontSize;

PrinterJob printerJob = PrinterJob.getPrinterJob(); // работа с принтером

JFileChooser chooser = new JFileChooser(); // файловые диалогиfilter = new FileNameExtensionFilter («csv», «xls»); // файловый фильтр


/* Получение шрифтов */ge = GraphicsEnvironment.getLocalGraphicsEnvironment();[] fonts = ge.getAvailableFontFamilyNames();fontBox;

item;


/* Меню */

/*File*/newAction;openAction;saveAsAction;saveAction;printAction;exitAction;


/*Edit*/undoAction;redoAction;copyAction;cutAction;pasteAction;hyperAction;


/*Tools*/Covariance;


/* Toolbar*/jbNew;jbOpen;jbSave;jbSaveAs;jbUndo;jbRedo;jbCopy;jbCut;jbPaste;jbPrint;

jbBold;jbItalic;jbUnderLine;


/* Впомогательные */

[] jtab = new JTable[4];jtp;[] jsp = new JScrollPane[4];

/* Иконки */newI = new ImageIcon («img/new.png»);openI = new ImageIcon («img/open.png»);saveI = new ImageIcon («img/save.png»);saveAsI = new ImageIcon («img/save_as.png»);printI = new ImageIcon («img/print.png»);exitI = new ImageIcon («img/exit.png»);undoI = new ImageIcon («img/undo.png»);redoI = new ImageIcon («img/redo.png»);copyI = new ImageIcon («img/copy.png»);cutI = new ImageIcon («img/cut.png»);pasteI = new ImageIcon («img/paste.png»);hlI = new ImageIcon («img/hyper.png»);

boldI = new ImageIcon («img/bold.png»);ulI = new ImageIcon («img/underline.png»);italI = new ImageIcon («img/italic.png»);

okI = new ImageIcon («img/ok.png»);helpI = new ImageIcon («img/help.png»);cancelI = new ImageIcon («img/cancel.png»);


/* Covariance dialog */dialog;

jtfRX;jtfRY;jtfOR;


public void init() {frame = new JFrame («Gnumeric»);.setSize (new Dimension (800, 600));.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);


/* Меню */

menuBar = new JMenuBar();

jmFile = new JMenu («File»);jmEdit = new JMenu («Edit»);jmView = new JMenu («View»);jmInsert = new JMenu («Insert»);jmFormat = new JMenu («Format»);jmTools = new JMenu («Tools»);jmData = new JMenu («Data»);jmHelp = new JMenu («Help»);


/*Мнемоники*/.setMnemonic (KeyEvent.VK_F);.setMnemonic (KeyEvent.VK_E);.setMnemonic (KeyEvent.VK_V);.setMnemonic (KeyEvent.VK_I);.setMnemonic (KeyEvent.VK_R);.setMnemonic (KeyEvent.VK_T);.setMnemonic (KeyEvent.VK_D);.setMnemonic (KeyEvent.VK_H);


/* Подменю * /

/* File */

/*Определение подменю кнопок*/= new JMenuItem (»New», newI);= new JMenuItem (»Open», openI);= new JMenuItem (» Save As», saveAsI);= new JMenuItem (»Save», saveI);= new JMenuItem (»Print», printI);= new JMenuItem (»Exit», exitI);

.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_N, InputEvent.CTRL_MASK));.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_O, InputEvent.CTRL_MASK));.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_S, InputEvent.CTRL_MASK));.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P, InputEvent.CTRL_MASK));

.add(newAction);.add(openAction);.addSeparator();.add(saveAsAction);.add(saveAction);.addSeparator();.add(printAction);.addSeparator();.add(exitAction);

.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);


/* Edit */

= new JMenuItem (»Undo», undoI);= new JMenuItem (»Redo», redoI);= new JMenuItem (»Copy», copyI);= new JMenuItem (»Cut», cutI);= new JMenuItem (»Paste», pasteI);= new JMenuItem (»Hyper Link.», hlI);

.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_Z, InputEvent.CTRL_MASK));.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_C, InputEvent.CTRL_MASK));.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_X, InputEvent.CTRL_MASK));.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_V, InputEvent.CTRL_MASK));

.add(undoAction);.add(redoAction);.addSeparator();.add(copyAction);.add(cutAction);.add(pasteAction);.addSeparator();.add(hyperAction);

undoAction.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);


/* Инициализация менюбара*/.add(jmFile);.add(jmEdit);.add(jmView);.add(jmInsert);.add(jmFormat);.add(jmTools);.add(jmData);.add(jmHelp);


/*Tools*/statAnalit = new JMenu («Statistical analysis»);= new JMenuItem («Covariance»);

.addActionListener(this);.add(Covariance);.add(statAnalit);


/* toolbar */

jtob = new JToolBar();.setFloatable(false);

= new JButton(newI);= new JButton(openI);= new JButton(saveI);= new JButton(saveAsI);= new JButton(undoI);= new JButton(redoI);= new JButton(copyI);= new JButton(cutI);= new JButton(pasteI);= new JButton(printI);

= new JButton(boldI);= new JButton(italI);= new JButton(ulI);

.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);.addActionListener(this);


jtob.add(jbNew);.add(jbOpen);.add(jbPrint);.addSeparator();.add(jbSave);.add(jbSaveAs);.addSeparator();.add(jbCopy);.add(jbCut);.add(jbPaste);.addSeparator();.add(jbUndo);.add(jbRedo);.addSeparator();


/* Шрифты */= new JComboBox(fonts);.setPreferredSize (new Dimension (150, 20));.setMaximumSize (new Dimension (150,20));.addActionListener(this);

.add(fontBox);.addSeparator();


/*размер текста*/snm = new SpinnerNumberModel (fontSize, 1,30,1);= new JSpinner(snm);.setPreferredSize (new Dimension (60,20)); // предпочитаемый размер.setMaximumSize (new Dimension (60,20)); // максимальный размер

.addChangeListener (new ChangeListener() {void stateChanged (ChangeEvent e) {bSize = (Integer) jspFontSize.getValue();= bSize;

}

});

.add(jspFontSize);

.addSeparator();.add(jbBold); jbBold.addActionListener(this);.add(jbItalic);jbItalic.addActionListener(this);.add(jbUnderLine); jbUnderLine.addActionListener(this);.addSeparator();


/* Табличка */

(int i = 0; i < 4; i++) {[i] = new JTable (new MarchModel (50,10));column = null;= jtab[i].getColumnModel().getColumn(0);.setPreferredWidth(20);[i].setGridColor (Color.BLACK);[i].setDefaultRenderer (jtab[i].getColumnClass(1), new DefaultTableCellRenderer() {Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {.setHorizontalAlignment (SwingConstants.CENTER);.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column);this;

}

});[i].setCellSelectionEnabled(true); // возможность выбора лишь оного елемента[i] = new JScrollPane (jtab[i]);


}


/* Вкладки */

= new JTabbedPane (JTabbedPane.BOTTOM);.addTab («Sheet 1», jsp[0]);.addTab («Sheet 2», jsp[1]);.addTab («Sheet 3», jsp[2]);

.add(jtp);

.setJMenuBar(menuBar);.add (jtob, BorderLayout.NORTH);

.add(jtp);

.setVisible(true);

}


/* Конструктор */() {();

}

/* Подсчет коввариации */class S4et_Covariance {Q = jtp.getSelectedIndex();[] xCols = jtab[Q].getSelectedRows(); // получаем значения Х[] yCols = jtab[Q].getSelectedRows(); // получаем значения У

Covariation = 0;

double GetCovariation() {

sumX = 0;sumY = 0;n = xCols.length;sredX;sredY;

sigma = 0; // сумма

/* Проверка на правильность ввода */(xCols.length!= yCols.length) {

_err dlog = null;(dlog == null) {= new Cov_err (Gnumeric.this);

}

} else {(int i = 0; i < xCols.length; i++) {+= xCols[i];+= yCols[i];

}

= sumX/xCols.length;= sumY/yCols.length;

(int i = 1; i <= xCols.length -1; i++) {

+= (xCols[i] - sredX) * (yCols[i] - sredY);



}

+= sigma/(n - 1);

}Covariation;

}


}

/*Covariance dialog*/class CovarianceDialog extends JDialog {

static final long serialVersionUID = 1L;

CovarianceDialog (Gnumeric gnumeric) {

(500, 300);

jtpCD = new JTabbedPane (JTabbedPane.TOP);.setSize (500, 200);panel = new JPanel();

jlRX = new JLabel («Input Range X:»);= new JTextField (10);.setMaximumSize (jtfRX.getMaximumSize());

jlRY = new JLabel («Input Range Y:»);= new JTextField (10);.setMaximumSize (jtfRY.getMaximumSize());

jlOR = new JLabel («Output Range:»);= new JTextField(10);

hBoxIn1 = Box.createHorizontalBox();.add(jlRX);.add (Box.createHorizontalStrut(3));.add(jtfRX);

hBoxIn2 = Box.createHorizontalBox();.add(jlRY);.add (Box.createHorizontalStrut(3));.add(jtfRY);

hBoxOr1 = Box.createHorizontalBox();.add(jlOR);.add (Box.createHorizontalStrut(3));.add(jtfOR);

vBoxIn = Box.createVerticalBox();.add(hBoxIn1);.add(hBoxIn2);.add (Box.createVerticalStrut(15));.add(hBoxOr1);

.add (vBoxIn, BorderLayout.CENTER);.addTab («Covariance», panel);


/* Кнопки для всех груп */

/* OK */jbOk = new JButton («Ok!», okI);

.addActionListener (new ActionListener() {void actionPerformed (ActionEvent e) {

Q = jtp.getSelectedIndex();

et_Covariance EnteredElements = new S4et_Covariance();. GetCovariation();

[EnteredElements.Q].setValueAt («Covariation:», 1, 1);[EnteredElements.Q].setValueAt((double) (EnteredElements. GetCovariation()), 1, 3);

}

});


/* Cancel */jbCancl = new JButton («Cancel», cancelI);

.addActionListener (new ActionListener() {void actionPerformed (ActionEvent e) {(false);

}

});


/* Help */jbHelp = new JButton («Help», helpI);

.addActionListener (new ActionListener() {void actionPerformed (ActionEvent e) {


}

});

hBoxButtons = Box.createHorizontalBox();.add(jbHelp);.add (Box.createGlue());

.add(jbCancl);.add (Box.createHorizontalStrut(1));.add(jbOk);.add (Box.createHorizontalStrut(15));

vBoxButtons = Box.createVerticalBox();.add(jtpCD);.add(hBoxButtons);

(vBoxButtons);

}

void Input_Output_Range () {Q = jtp.getSelectedIndex();

(-1 == jtab[Q].getSelectedColumn()) {.setText («Sheet» + (jtp.getSelectedIndex()+1) +»!» + «A1»);.setText («Sheet» + (jtp.getSelectedIndex()+1) +»!» + «A1»);.setText («Sheet» + (jtp.getSelectedIndex()+1) +»!» + «A1»);

}{et_Covariance EnteredElements = new S4et_Covariance();. GetCovariation();

.setText («Sheet» + (jtp.getSelectedIndex()+1)+»!» + jtab[Q].getColumnName (jtab[Q].getSelectedColumn()) + (jtab[Q].getSelectedRow()+1));.setText («Sheet» + (jtp.getSelectedIndex()+1)+»!» + jtab[Q].getColumnName (jtab[Q].getSelectedColumn()) + (jtab[Q].getSelectedRow()+1));.setText («Sheet» + (jtp.getSelectedIndex()+1)+»!» + jtab[Q].getColumnName (jtab[Q].getSelectedColumn()) + (jtab[Q].getSelectedRow()+1));


}

}


}


/* Action */void actionPerformed (final ActionEvent ae) {

Q = jtp.getSelectedIndex();int row;int col;


/*Covariance dialog*/(ae.getSource()!= null && ae.getSource().equals(Covariance)) {(dialog == null) {= new CovarianceDialog (Gnumeric.this);. Input_Output_Range();.setVisible(true);

} else {dialog.setVisible(true);}

}


/* Menu

* File

* New */(ae.getSource()!= null && (ae.getSource().equals(jbNew) || ae.getSource().equals(newAction))) {.out.print («New»);

}

//Open(ae.getSource()!= null && (ae.getSource().equals(jbOpen) || ae.getSource().equals(openAction))) {.setFileFilter(filter);returnVal = chooser.showOpenDialog(chooser);(returnVal == JFileChooser.APPROVE_OPTION) {


}


}

//Save As(ae.getSource()!= null && (ae.getSource().equals(jbSaveAs) || ae.getSource().equals(saveAsAction))) {.setFileFilter(filter);returnVal = chooser.showSaveDialog(chooser);(returnVal == JFileChooser.APPROVE_OPTION) {


}


}

//Save(ae.getSource()!= null && (ae.getSource().equals(jbSave) || ae.getSource().equals(saveAction))) {


}

//Print(ae.getSource()!= null && (ae.getSource().equals(printAction) || ae.getSource().equals(jbPrint))) {(printerJob.printDialog()) {


}

}

//Exit(ae.getSource()!= null && (ae.getSource().equals(exitAction))) {.exit(0);

}


/* Edit */

//undo(ae.getSource()!= null && (ae.getSource().equals(undoAction) || ae.getSource().equals(jbUndo))) {

}

//redo(ae.getSource()!= null && (ae.getSource().equals(redoAction) || ae.getSource().equals(jbRedo))) {


}

//copy(ae.getSource()!= null && (ae.getSource().equals(copyAction) || ae.getSource().equals(jbCopy))) {


}

//cut(ae.getSource()!= null && (ae.getSource().equals(cutAction) || ae.getSource().equals(jbCut))) {


}

//paste(ae.getSource()!= null && (ae.getSource().equals(pasteAction) || ae.getSource().equals(jbPaste))) {


}

//hyper link(ae.getSource()!= null && ae.getSource().equals(hyperAction)) {


}


/* Формат текста

* ЖКЧ

* Сам текст */(ae.getActionCommand().equals(fontBox)) {= (String) fontBox.getSelectedItem();


}

//bold(ae.getSource()!= null && ae.getSource().equals(jbBold)) {[Q].setFont (new Font (item, Font.BOLD, fontSize));

}

//Italic(ae.getSource()!=null && ae.getSource().equals(jbItalic)) {[Q].setFont (new Font (item, Font.ITALIC, fontSize));

}

//underlined(ae.getSource()!= null && ae.getSource().equals(jbUnderLine)) {[Q].setFont (new Font (item, Font.PLAIN, fontSize));

}


}

static void main (String [] args) {.invokeLater (new Runnable() {void run() {Gnumeric();

}

});

}

}

MarchModel extends AbstractTableModel {static final long serialVersionUID = 1L;numRows;numCols;[] colNames;[][] data;

(int len, int cols) {();= len;= cols;

= new String[cols];(int i = 0; i < cols; i++) {(i == 0) colNames[i] = «#»;{a = i-1+'A';[] b= new char [1];[0] = (char) a;[i] = new String(b);

}

}= new Object[len] [cols];(int i = 0; i < len; i ++)(int j = 0; j < cols; j++) {(j == 0) data[i] [j] = i+1;data[i] [j] = «»;

}

}

int getRowCount() {return numRows;}int getColumnCount() {return numCols;}String getColumnName (int c) {return colNames[c];}Object getValueAt (int r, int c) {return data[r] [c];} boolean isCellEditable (int r, int c) {(c!=0) {return true;}false;

}void setValueAt (Object obj, int r, int c) {[r] [c] = obj;(r, c);

}


}


КУРСОВИЙ ПРОЕКТ Створення на мові програмування Java аплету, реалізуючого інтерфейс Gnumeric.org Gnumeric

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ