3976

Створення простого текстового редактора

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота №9 (Створення простого текстового редактора.) Мета роботи: Створення простого текстового редактора. Мета: Написати програму на Java простого текстового редактора на Java План роботи. Вивчення додаткових компонентів для створе...

Украинкский

2012-11-10

331.12 KB

26 чел.

9.

Лабораторна робота №9 (Створення простого текстового

редактора.)

Мета роботи: Створення простого текстового редактора.

Мета: Написати програму на Java простого текстового редактора на Java

План роботи

1. Вивчення додаткових компонентів для створення програм з графічним інтерфейсом.

2. На основі заданої програми написати програму простого текстового редактора.

3. Дослідити роботу компонентів.

Теоретичні відомості

Такий компонент як меню є практично обов’язковим для кожної програми із графічним

інтерфейсом. Для створення меню служить клас JMenuBar. Як правило він розташовується

горизонтально в верхньому лівому кутку вікна. Він є контейнером для об’єктів Jmenus. Для того,

щоб додати Jmenu до JmenuBar слід використовувати метод add(JMenu menu). Для того, щоб

додати обєкт JmenuBar до вікна або діалогу, слід скористатись методом setJMenuBar() в Jframe

або JDialog.

JMenuItem

Клас JmenuItem є підкласом AbstractButton – він представляє один рядок меню. Ми

можемо задати окрему іконку для кожного рядка (метод setIcon()) і пов’язати певний набір

клавіш на клавіатурі із даним рядком меню (метод setMnemonic()). Якщо такий набір клавіш

задано, то відповідна буква в рядку меню буде підкреслена. Як правило, ми пов’язуємо кнопку із

об’єктом типу ActionListener для того, щоб пов’язати подію натискання на кнопці із обробником

події. Інший шлях – це створити кнопку на базі об’єкту Action, в котрому ми можемо задати текст

і/або іконку, котрі будуть показані на кнопці і метод котрий буде викликатись у випадку, коли

кнопка буде натиснута. Один об’єкт Action може бути доданий до кількох об’єктів JMenuItems і

Jbuttons. При цьому, якщо дана Action є неактивною, всі об’єкти JmenuItems і Jbuttons будуть

неактивними (метод setEnable(false)). І навпаки, якщо необхідно активізувати рядки меню або

кнопки, пов’язані із однією Action, достатньо викликати один метод в Action – setEnable(true).

JMenu

Об’єкт цього класу як правило додається до JMenuBar або до іншого об’єкту JMenu. В

останньому випадку він виглядає, як підменю, тобто в меню верхнього рівня додається рядок із

трикутником із правого боку. Якщо вказівник мишки переміщується на такий рядок – з’являється

додане Jmenu. Для того, щоб додати обєкт JmenuItem до JMenu – використовується метод add()

класу Jmenu. До Jmenu з допомогою методу addSeparator() можна також додати об’єкт Separator.

Він, як правило, виглядає як звичайна лінія, котра розділює рядки в меню.

82


JCheckBoxMenuItem

Цей клас є підкласом JmenuItem, він може бути вибраним (selected) або невибраним

(deselected). Його вигляд подібний до класу JCheckBox. Використовуються методи

isSelected()/setSelected() або getState()/setState() для того, щоб визначити/задати стан компонента.

Для того, щоб мати можливість вибрати один компонент і одночасно зняти вибір із інших,

необхідно додати цю групу компонентів до ButtonGroups.

JRadioButtonMenuItem

Цей клас є підкласом JmenuItem, він може бути вибраним (selected) або невибраним

(deselected). Його вигляд подібний до класу JRadioButton. Використовуються методи

isSelected()/setSelected() або getState()/setState() для того, щоб визначити/задати стан компонента.

Для того, щоб мати можливість вибрати один компонент і одночасно зняти вибір із інших,

необхідно додати цю групу компонентів до ButtonGroups.

JToolBar

Цей клас – Swing реалізація тулбару (палітри інструментів). Найчастіше тулбар

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

спосіб додати кнопки до тулбару – шляхом додавання об’єктів Actions. JToolBar також дозволяє

додати об’єкт Jseparator з допомогою методу addSeparator().

Підтримується дві орієнтації, VERTICAL і HORIZONTAL, котрі визначаються з допомогою

властивості orientation.

Приклад 1.

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import javax.swing.*;

public class Lab6 extends JFrame

{

public String FONTS[] = {"Serif", "SansSerif", "Courier"};

protected Font fonts[];

protected JTextArea textArea;

protected JMenuItem[] fontMenus;

protected JCheckBoxMenuItem bold;

protected JCheckBoxMenuItem italic;

protected JFileChooser fileChooser;

public Lab6()

{

super("Basic text editor");

setSize(450, 350);

83


fonts = new Font[FONTS.length];

for (int k = 0; k < FONTS.length; k++)

fonts[k] = new Font(FONTS[k], Font.PLAIN, 12);

textArea = new JTextArea();

getContentPane().add(new JScrollPane(textArea), BorderLayout.CENTER);

textArea.append("Basic text editor");

setJMenuBar(createMenuBar());

fileChooser = new JFileChooser();

fileChooser.setCurrentDirectory(new File("."));

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

});

updateMonitor();

setVisible(true);

}

protected JMenuBar createMenuBar()

{

final JMenuBar menuBar = new JMenuBar();

JMenu mFile = new JMenu("File");

mFile.setMnemonic('f');

JMenuItem item = new JMenuItem(new ActionNew());

item.setMnemonic('n');

mFile.add(item);

item = new JMenuItem(new ActionOpen());

item.setMnemonic('o');

mFile.add(item);

item = new JMenuItem(new ActionSave());

item.setMnemonic('s');

mFile.add(item);

mFile.addSeparator();

item = new JMenuItem(new ActionExit());

84


item.setMnemonic('x');

mFile.add(item);

menuBar.add(mFile);

FontAction fontAction = new FontAction();

JMenu mFont = new JMenu("Font");

mFont.setMnemonic('o');

ButtonGroup group = new ButtonGroup();

fontMenus = new JMenuItem[FONTS.length];

for (int k = 0; k < FONTS.length; k++)

{

int m = k + 1;

fontMenus[k] = new JRadioButtonMenuItem(

m + " " + FONTS[k]);

boolean selected = (k == 0);

fontMenus[k].setSelected(selected);

fontMenus[k].setMnemonic('1' + k);

fontMenus[k].setFont(fonts[k]);

fontMenus[k].addActionListener(fontAction);

group.add(fontMenus[k]);

mFont.add(fontMenus[k]);

}

mFont.addSeparator();

bold = new JCheckBoxMenuItem("Bold");

bold.setMnemonic('b');

Font fn = fonts[1].deriveFont(Font.BOLD);

bold.setFont(fn);

bold.setSelected(false);

bold.addActionListener(fontAction);

mFont.add(bold);

italic = new JCheckBoxMenuItem("Italic");

italic.setMnemonic('i');

fn = fonts[1].deriveFont(Font.ITALIC);

italic.setFont(fn);

italic.setSelected(false);

italic.addActionListener(fontAction);

mFont.add(italic);

menuBar.add(mFont);

return menuBar;

}

85


protected void updateMonitor()

{

int index = -1;

for (int k = 0; k < fontMenus.length; k++)

{

if (fontMenus[k].isSelected())

{

index = k;

break;

}

}

if (index == -1)

return;

if (index == 2)

{ // Courier

bold.setSelected(false);

bold.setEnabled(false);

italic.setSelected(false);

italic.setEnabled(false);

}

else

{

bold.setEnabled(true);

italic.setEnabled(true);

}

int style = Font.PLAIN;

if (bold.isSelected())

style |= Font.BOLD;

if (italic.isSelected())

style |= Font.ITALIC;

Font fn = fonts[index].deriveFont(style);

textArea.setFont(fn);

textArea.repaint();

}

class ActionNew extends AbstractAction

{

public ActionNew()

{

super("New", new ImageIcon("file_new.gif"));

}

public void actionPerformed(ActionEvent e)

{

textArea.setText("");

}

86


}

class ActionOpen extends AbstractAction

{

public ActionOpen()

{

super("Open...", new ImageIcon("file_open.gif"));

}

public void actionPerformed(ActionEvent e)

{

Lab6.this.repaint();

if (fileChooser.showOpenDialog(Lab6.this) !=

JFileChooser.APPROVE_OPTION)

return;

Thread runner = new Thread()

{

public void run()

{

File fChoosen = fileChooser.getSelectedFile();

try

{

FileReader in = new FileReader(fChoosen);

textArea.read(in, null);

in.close();

}

catch (IOException ex)

{

ex.printStackTrace();

}

}

};

runner.start();

}

};

class ActionSave extends AbstractAction

{

public ActionSave()

{

super("Save...", new ImageIcon("file_save.gif"));

}

public void actionPerformed(ActionEvent e)

{

Lab6.this.repaint();

if (fileChooser.showSaveDialog(Lab6.this) !=

87


JFileChooser.APPROVE_OPTION)

return;

Thread runner = new Thread()

{

public void run()

{

File fChoosen = fileChooser.getSelectedFile();

try

{

FileWriter out = new FileWriter(fChoosen);

textArea.write(out);

out.close();

}

catch (IOException ex)

{

ex.printStackTrace();

}

}

};

runner.start();

}

};

class ActionExit extends AbstractAction

{

public ActionExit()

{

super("Exit");

}

public void actionPerformed(ActionEvent e)

{

System.exit(0);

}

}

class FontAction extends AbstractAction

{

public void actionPerformed(ActionEvent e)

{

updateMonitor();

}

}

public static void main(String argv[])

{

new Lab6();

88


}

}

Після того, як ви запустите цю програму на виконання ви побачите наступне вікно:

Пояснення до прикладу:

Даний клас Lab6 є підкласом JFrame і служить основним вікном для нашого прикладу.

Змінні (поля) класу:

String FONTS[]: масив типу String, котрий задає можливі шрифти для редактора

Font[] fonts: масив типу Font, створених на основі попереднього масиву.

JTextArea textArea: використовується як текстовий редактор.

JMenuItem[] fontMenus: масив обєктів JMenuItem для відображення шрифтів в меню.

JCheckBoxMenuItem bold: рядки меню для вибору/відміни типу шрифту - напівжирний.

JCheckBoxMenuItem italic: рядок меню для вибору/відміни типу шрифту – курсив.

JFileChooser chooser: стандартне діалогове вікно, котре використовується для

зберігання та читання простих текстових файлів.

В конструкторі класу Lab6 основні властивості вікна – заголовок та розміри. Далі

створюється об’єкт fonts на основі масиву FONTS[]. Потім, обєкт textArea класу JTextArea

створюється і додається в JscrollPane, котрий в свою чергу додається в вікно. Метод

createMenuBar() викликаєтьчя для того, щоб створити меню, котре потім додається до вікна

з допомогою методу setJMenuBar().

Кожен рядок меню створюється на основі Actions. Коли даний рядок меню буде натиснуто

мишкою – викликається метод public void actionPerformed(ActionEvent e) для даного рядка. Ці

Actions для кожного рядка задають назву рядка і для деяких рядків – іконку. Наприклад, в

ActionNew – в конструкторі викликається конструктор суперкласу super("New", new

ImageIcon("file_new.gif")).

Меню складається з двох підменю: “File” і “Font.” Рядок меню “New” в підменю “File”

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

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

89


даний рядок меню може бути активізованим при натисканні клавіш ‘n’ коли підменю “File” є

видимим, оскільки ‘n’ є мнемонікою для даного рядка. Підменю File також має свою клавішу

мнемоніку - ‘f,’ тобто, натиснувши ALT-F коли вікно є активним, “File” підменю буде показано.

Рядок меню “Open” дозволяє вибрати текстовий файл із жорсткого диску з допомогою

діалогового вікна fileChooser. Коли текстовий файл вибрано, відкривається FileReader метод read() для нашого компонента JTextArea і вибраний файл завантажується. Пункт

меню “Save” дозволяє вибрати файл і записати в нього набраний текст. Обидві операції читання

із фалу та запису в файл виконуються в окремому потоці.

Пункт меню “Exit” дозволяє припинити виконання програми. Він відділений від

попередніх пунктів меню сепаратором.

Підменю “Font” дозволяє вибрати шрифт та стиль шрифту в нашому редакторі - складається із

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

updateMonitor() (див. нижче). Кожен шрифт відображається як рядок меню. Оскільки тільки

один фонт може бути вибраним, використовується JRadioButtonMenuItems для пунктів

меню, потім всі пункти меню додаються до об’єкту ButtonGroup, що дозволяє вибрати лише

один із них.

Два інших пункти меню в підменю “Font” дозволяють вирати стиль шрифту – півжирний і

курсив. Ці пункти створюються як підкласи JCheckBoxMenuItems оскільки ці властивості

шрифту можуть бути вибрані незалежно. Для них використовуються той самий слухач fontAction.

Метод updateMonitor() використовується для того, щоб встановити відповідний

шрифт та стиль шрифта для нашого редактора. При цьому програма продивляється пункти меню

в підменю “Font”.

Порядок виконання роботи.

1.Виконайта даний приклад. Спробуйте записати файл на диск та прочитати файл.

2.Створіть тулбар (палітру інструментів) для даного текстового редактора. Для цього виконайте

наступні кроки.

2.1.В блоці ініціалізації додайте наступний рядок (тут і надалі рядки, котрі необхідно

додати виділені напівжирним шрифтом):

...

protected

JFileChooser

fileChooser;

protected JToolBar toolBar;

public Lab6()

{

...

2.2.В конструкторі Lab6 додайте рядок:

...

getContentPane().add(createToolBar(), BorderLayout.NORTH);

updateMonitor();

setVisible(true);

...

2.3.Додайте до класу Lab6 метод

protected JToolBar createToolBar()

90


{

toolBar = new JToolBar();

toolBar.add(actionNew);

toolBar.add(actionOpen);

toolBar.add(actionSave);

return toolBar;

}

3. Зробити висновок.

Контрольні питання

1. Який метод слід використовувати для того, щоб додати Jmenu до JmenuBar?

2. Який метод слід використовувати для того, щоб додати об’єкт JmenuBar до вікна

або діалогу?

3. Який метод слід використовувати для того, щоб додати обєкт JmenuItem до JMenu.

4. З допомогою якого методу JToolBar дозваляє додати обєкт Jseparator

5. Якщо дана Action є неактивною, всі обєкти JmenuItems і Jbuttons будуть

неактивними?

6. Один об’єкт Action може бути доданий до кількох обєктів JMenuItems і Jbuttons?

7. Клас JCheckBoxMenuItem є підкласом JmenuItem, він може бути вибраним (selected)

або невибраним (deselected)?

8. Оформити звіт. У звіті повинно бути текст програми і скріншоти результатів.

9. Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм

[Ваша Фамілія]_labN_k.class ,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb,

де N – номер лабораторної роботи, k – номер програми.

91



 

А также другие работы, которые могут Вас заинтересовать

40362. Невроз, депрессивно-фобическая форма 35 KB
  Панические атаки неожиданно возникающий и быстро в течение нескольких минут нарастающий симптомокомплекс вегетативных расстройств синдром Da Costa сердцебиение стеснение в груди ощущение удушья нехватки воздуха потливость головокружение сочетающийся с ощущением надвигающейся смерти страхом потери сознания либо потери контроля над собой сумасшествия. Клинический диагноз: на основе характерного симптомокомплекса психопатолгических расстройств можно поставить диагноз невроз депрессивнофобическая форма. Дифференциальный...
40363. Личностные расстройства при стрессе 50 KB
  Клиническая типология ПТСР Удельный вес и значимость соотношения коморбидных симптомов и осевых симптомов ПТСР позволяет выделить несколько типов ПТСР что имеет практическую терапевтическую значимость. Тревожный тип ПТСР наблюдается у 32 больных характеризуется высоким уровнем соматической и психической немотивированной тревоги на гипотимноокрашенном аффективном фоне с переживанием не реже нескольких раз в сутки непроизвольных с оттенком навязчивости представлений отражающих психотравматическую...
40364. Шизофрения, параноидная форма, непрерывно-прогредиентное течение, парафренный синдром 55 KB
  Мышечная система: общее развитие умеренное болезненности при ощупывании нет тонус нормальный дрожания нет. СИСТЕМА ОРГАНОВ ДЫХАНИЯ: Дыхание осуществляется через нос отделяемого из носа нет Грудная клетка обычной формы симметричная без видимых деформаций в акте дыхания участвует активно и симметрично тип дыхания смешанный ЧДД 18. СИСТЕМА ОРГАНОВ КРОВООБРАЩЕНИЯ: В прекардиальной области и в области основания сердца деформаций нет. Аускультативно: тоны чистые ясные пульс симметричный на обеих руках равномерный умеренного...
40365. Классификация наркомании и токсикомании 52 KB
  Наркомания обусловленная злоупотреблением препаратами конопли Злоупотребление седативноснотворными средствами: наркомании вызванные снотворными; токсикомании обусловленные злоупотреблением транквилизаторами Злоупотребление психостимуляторами: амфетаминовая наркомания; злоупотребление кустарными препаратами эфедрина и эфедринсодержащих смесей; кокаиновая наркомания; злоупотребление кофеином. Полинаркомании осложненные наркомании политоксикомании. Клинические проявления и закономерности течения Основой формирования наркомании и...
40366. Нарушения эмоций, воли, внимания 41 KB
  Эмоции человек испытывает постоянно: он доволен или недоволен у него хорошее настроение или не очень хорошее. Эмоции пронизывают всю личность человека могут ускорять или замедлять мышление воздействуют на волевые процессы на всю саму в целом. Эмоции участвуют в патогенезе многих заболеваний; их трудно както квалифицировать можно лишь сравнивать у одного человека.
40367. Нарушение ощущения и восприятия 39.5 KB
  Психосенсорные расстройства встречаются при эпилепсии энцефалитах и опухолях мозга могут быть следствием органических поражений теменнозатылочиых отделов и области межуточного мозга К расстройствам восприятия относят иллюзии и галлюцинации. Галлюцинации сенсорное восприятие имеющее характер истинного восприятия но в отсутствие внешнего раздражения органов чувств. Галлюцинации классифицируют по органам чувств как слуховые наиболее часто встречаемые зрительные тактильные обонятельные. элементарные фотопсип элементарные зрительные...
40368. Нарушения памяти и интеллекта 52 KB
  Реферат на тему Нарушения памяти и интеллекта Выполнила студентка 9 группы 5 курса лечебного факультета Бекк Елена Георгиевна Новосибирск 2006 АМНЕСТИЧЕСКИЕ СИНДРОМЫ. В структуре психоорганического синдрома мы видим триаду симптоматики то есть поражаются в основном три сферы: первая сфера память нарушение интеллекта вторая сфера нарушение эмоций третья сфера нарушение воли Вместе с тем что поражается память у больных вскоре заметна становится аффективная нейустойчивость аффективная лабильность недержание эмоций. Деменция ...
40369. Некоторые особенности диагностики и лечения аффективных расстройств 51 KB
  Леонгард разделял пациентов с маниакальнодепрессивным психозом и пациентов с депрессиями отмечая что первое из вышеперечисленных заболеваний имеет более тесное родство с аффективными расстройствами. были выявлены отличия в анамнезе пациентов с биполярными и униполярными расстройствами. В ходе исследования было обнаружено что у пациентов с маниакальнодепрессивным психозом чаще встречались в анамнезе аффективные расстройства в частности маниакальные. В частности в группе пациентов с маниакальнодепрессивным психозом заболевание начиналось...
40370. Непрерывнотекущая шизофрения 40 KB
  Диапазон ее клинических вариантов по степени прогредиентности чрезвычайно широк от юношеской злокачественной шизофрении до вялотекущей проявляющейся в основном расстройствами неврозоподобного характера. Между этими крайними вариантами непрерывнотекущей шизофрении среднее место занимает параноидная шизофрения отличающаяся средней степенью прогредиентности. При непрерывнотекущей шизофрении наблюдаются экзацербации и послабления процесса нередко констатируется спонтанная или медикаментозная стабилизация однако ремиссии для этой формы...