Читайте также:
|
|
Для поддержки пользовательских интерфейсов язык Java содержит библиотеки классов, позволяющие создавать и поддерживать окна, использовать элементы управления (кнопки, меню, полосы прокрутки и др.), применять инструменты для создания графических приложений. Графические инструменты и интерфейсы пользователя в языке Java реализованы с помощью двух библиотек:
· Пакет AWT (загружается java.awt) содержит набор классов, позволяющих выполнять графические операции и создавать элементы управления. Этот пакет поддерживается последующими версиями языка, однако считается весьма ограниченным и недостаточно эффективным.
· Пакет Swing (загружается javax.swing, имя javax обозначает, что пакет не является основным, а только расширением языка) содержит улучшенные и обновленные классы, по большей части аналогичные AWT. К именам этих классов добавляется J (JButton, JLabelи т.д.). Пакет является частью библиотеки JFC (Java FoundationClasses), которая содержит большой набор компонентов JavaBeans, предназначенных для создания пользовательских интерфейсов.
Swing предоставляет более гибкие интерфейсные компоненты, чем более ранняя библиотека AWT. В отличие от AWT, компоненты Swing разработаны для одинаковой кросс-платформенной работы, в то время как компоненты AWT повторяют интерфейс исполняемой платформы без изменений. AWT же использует только стандартные элементы ОС для отображения, то есть для каждого элемента создается отдельный объект ОС (окно), в связи с чем, AWT не позволяет создавать элементы произвольной формы (возможно использовать только прямоугольные компоненты), элементы управления на основе AWT всегда отображаются поверх Swing-элементов (так как все Swing компоненты отображаются на поверхности контейнера).
11. Расположение компонентов на экране. Диспетчеры компоновки. Заполнители.
Положение компонента описывается двумя целыми числами (тип int) x и y. В Java (как и во многих языках программирования) ось x проходит традиционно – горизонтально, направлена вправо, а ось у – вертикально, но направлена вниз, а не вверх, как принято в математике.
Для описания положения компонента предназначен специальный класс – Point (точка). В этом классе определено два public int поля x и y, а также множество конструкторов и вспомогательных методов для работы с ними. Класс Point применяется во многих типах AWT (Abstract Window Toolkit), где надо задать точку на плоскости.
Для компонента эта точка задает положение левого верхнего угла.
Установить положение компонента:метод setLocation, который может принимать в качестве аргументов пару целых чисел, либо Point. Узнать текущее положение можно с помощью метода getLocation(), возвращающего Point, либо с помощью методов getX() и getY(), которые появились с версии Java 1.2.
Для того чтобы управлять расположением элементов внутри окон-контейнеров, в Java существует менеждер раскладок, он же диспетчер компоновки (layout manager). От него наследуются пять классов, определяющих тот или иной тип расположения компонентов пользовательского интерфейса в окне. Когда вам требуется изменить тип расположения, вы создаете тот или иной класс раскладки, отвечающий вашим запросам, и передаете его в вызываемый метод setLayout(), изменяющий текущую раскладку:
// Установить расположение элементов вдоль рамки окна: setLayout(new BorderLayout());
FlowLayout. Это простейший способ расположения элементов один за другим, применяемый по умолчанию. Когда в одной строке уже не помещаются новые элементы, заполнение продолжается с новой строки.
CardLayout. При раскладке этого типа элементы размещаются один за другим, как карты в колоде. Обычно такой расклад удобен, если вам необходимо динамически изменять интерфейс окна. Кроме того, вы можете делать элементы, находящиеся один над другим по очереди.
BorderLayout. Эта раскладка размещает элементы либо рядом с выбранным краем окна, либо в центре. Для этого после установки BorderLayout добавление элементов в окно-контейнер производится методом add() с дополнительным параметром, задаваемым строками North, South, East, West и Center. Каждая из них означает тот край окна, к которому необходимо прижать вставляемый элемент.
GridLayout. GridLayout располагает элементы один за другим внутри некоторой условной таблицы. Все элементы будут одинакового размера. Размер ячеек можно программно изменять.
GridBagLayout. Это самая мудреная, но в то же время и самая мощная раскладка. Она располагает элементы в условной таблице, как это делается в случае с GridLayout. Но в отличие от последней, можно варьировать размер каждого элемента в отдельности. Правда, придется набрать дополнительно не одну строчку исходного текста.
Заполнители (BoxGlues.java) работают как своего рода «пружины», помещаемые вертикально или горизонтально, соответственно текущему расположению, и раздвигают компоненты, разделяя все оставшееся в контейнере свободное место между собой. Именно с помощью заполнителей можно центрировать компоненты, размещать их не сверху, а снизу, равномерно распределять между ними все доступное пространство и т. д.
12. Архитектура модель-представление-контроллер. Look and Feel. Меню. Элементы меню и подменю. Обработка событий меню.
Концепция MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента:
· Модель (англ. Model). Модель предоставляет знания: данные и методы работы с этими данными, реагирует на запросы, изменяя своё состояние. Не содержит информации, как эти знания можно визуализировать.
· Представление, вид (англ. View). Отвечает за отображение информации (визуализацию). Часто в качестве представления выступает форма (окно) с графическими элементами.
· Контроллер (англ. Controller). Обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
Представление и контроллер зависят от модели. Модель не зависит ни от представления, ни от контроллера. Назначение разделения: позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.
С использованием Look And Feel можно одной командой изменить стиль всех окон и диалогов в приложении. Существует около десятка стандартных Look And Feel встроенных в java, а помимо этого возможна установка сторонних Look And Feel и самостоятельное создание их. LookAndFeel крайне удобны тем, что с их помощью можно стандартизировать оформление всего приложения, и затем, при необходимости, легко изменять стили оформления одновременно для всех элементов приложения.
Большинство операций, связанных с Look And Feel, могут быть осуществлены с использованием статических методов класса UIManager.
MenuBar, это основной класс всей системы меню, служащий контейнером для других классов. Когда вы создаете окно, то в качестве ссылки на добавляемое меню нужно передать ссылку на класс MenuBar.
Следующий класс Menu на полосе меню отображается как пункт выбора, который, если по нему щелкнуть, раскрывается в виде странички с пунктами выбора (pop-up menu). Сами же элемены выбора меню обычно реализуются как экземпляры классов MenuItem (простой элемент выбора) и CheckboxMenuItem (отмечаемый элемент выбора).
13. Диалоговые окна. Модальность. Стандартные диалоговые окна. Создание собственного диалогового окна, обмен данными.
Связанные между собой управляющие элементы часто выводятся в диалоговом окне. Диалоговые окна в основном используются для получения информации, вводимой пользователем. Они подобны окну аплета, но при этом всегда являются дочерними окнами и не содержат строк меню. В остальном диалоговые окна функционируют аналогично. (Например, к ним можно добавлять управляющие элементы.) Диалоговые окна могут быть модальными или немодальными- Если модальное диалоговое окно активно, то вся входная информация будет направляться ему. Это означает, что до закрытия диалогового окна нельзя получить доступ к другим частям программы. Если активно немодальное диалоговое окно, то фокус ввода может быть направлен в другое окно программы, т.е. остальные части программы остаются активными и доступными.
Dialog (Frame владелец, boolean режим)
Dialog (Frame владелец, String заголовок, boolean режим)
Здесь владелец - это окно, владеющее данным диалоговым окном. Если параметр режим имеет значение true, то диалоговое окно является модальным, в противном случае - немодальным. Заголовок диалогового окна можно передать с помощью параметра заголовок. Обычно вам придется создавать подкласс класса Dialog и добавлять функции, необходимые для вашего приложения.
Java поддерживает встроенные диалоговые окна, позволяющие открывать и сохранять файлы. Чтобы создать диалоговое окно для работы с файлами, необходимо создать объект класса FileDialog. Тогда на экран будет выведено файловое диалоговое окно. Обычно оно представляет собой стандартное файловое диалоговое окно, обеспечиваемое операционной системой.
FileDialog(Frame владелец, String имя)
FileDialog(Frame владелец, String имя, int режим)
Здесь владелец - окно, владеющее данным диалоговым окном, а имя - заголовок этого окна. Если параметр режим имеет значение FileDialog.LOAD, то файл будет открыт для чтения, а если FileDialog.SAVE, то файл будет открыт для записи.
В классе FileDialog существуют методы, позволяющие определить имя файла и путь к нему. Приведем два примера таких методов:
String getDirectory()
String getFile()
14. Апплеты. Создание апплетов. Отличия апплетов от приложений, жизненный цикл апплетов. Передача параметров апплету.
Приложения - это самостоятельные Java-программы, а программы, работающие под управлением других программ (Web-бр), называются апплетами. Апплет - это программа, способная обрабатывать действия пользователя и динамически менять свое поведение. Java-апплеты, в отличие от обычных Java-приложений, в целях безопасности не имеют доступа к файлам локального компьютера. Файлы могут быть получены лишь из Web.
Апплеты в библиотеке Java представлены стандартным классом Applet, но для пользователя не представляет интереса создание экземпляра этого класса. Для того чтобы придать апплету осмысленность, необходимо создать свой класс, являющийся производным от класса Applet. От этого класса они наследуют все необходимые методы для правильной загрузки и работы апплета. Таким образом, пользователь может переопределять те методы, которые ему необходимы.
В отличие от приложений Java, апплеты не должны реализовать a main метод.
Когда апплет загружается, происходит следующее:
1.Экземпляр управления апплета class (Applet подкласс), создается. 2.Апплет инициализирует себя. 3. Апплет начинает работать.
Когда пользовательские переходит на другую страницу, браузер останавливает и уничтожает апплет. Состояние апплета не сохраняется. Когда пользователь возвращается к странице, браузер запускает новый экземпляр апплета.
Когда Вы обновляете или перезагружаете страницу браузера, текущий экземпляр апплета останавливается и уничтожается, и новый экземпляр создается.
Когда пользователь выходит из браузера, у апплета есть возможность остановить себя и выполнить заключительную уборку перед выходами браузера.
15. Ввод и вывод двоичных данных. Абстрактные классы InputStream и OutputStream. Маркеры. Фильтрованные потоки, буфферизованные потоки.
Потоки байтов обрабатывают ввод-вывод необработанных двоичных данных.
Программы используют потоки байтов, чтобы выполнить ввод и вывод 8-разрядных байтов. Все классы потока байтов происходят от InputStream и OutputStream.
CopyBytes проводит большую часть его времени в простом цикле, который читает входной поток и пишет поток вывода, один байт за один раз.
Абстрактный класс InputStream предоставляет начальный интерфейс к потоку ввода данных и частично реализует его. С помощью набора методов, реализуемого классом InputStream, можно читать байты или массивы байтов, узнавать количество доступных для чтения данных, отмечать место в потоке, где в настоящий момент происходит чтение, сбрасывать указатель текущей позиции в потоке и пропускать ненужные байты в потоке.
Открыть поток ввода можно, создав объект класса InputStream. Закрыть его можно двумя способами: дождаться, пока сборщик мусора (garbage collector) Java будет искать в памяти компьютера неиспользуемые классы и закроет ваш поток, или же закрыть его методом close(), как обычно и делается.
Для создания потоков ввода применяется другой класс - OutputStream, который, как и InputStream, является абстрактным. Методы, предоставляемые OutputStream, позволяют записывать байты и массивы байтов в поток вывода. Как и InputStream, поток OutputStream открывается, когда вы его создаете, и закрывается либо сборщиком мусора, либо методом close().
DataInputStream и DataOutputStream относятся к так называемым фильтровым классам, то есть классам, задающим фильтры для чтения и записи определенных форматов данных. Фильтровые классы не работают сами по себе, а принимают или отсылают данные простым потокам FileInputStream, FileOutputStream и т. д. Обычное создание потока вывода данных на базе класса DataOutputStream сводится к одной строке:
DataOutStream is =
new DataOutStream (new FileOutputStream ("data.dat"));
После того как поток создан, в него можно выводить форматированные данные. Для этого в арсенале класса DataOutputStream имеется целый набор методов writeXXX() для записи различных данных, где XXX - название типа данных. Вот так выглядит фрагмент кода для вывода в созданный нами поток data.dat:
dos.writeDouble(doubleVar);
dos.writeInt(intVar);
dos.writeChars(StringVar);
dos.close();
Буферизованные входные потоковые данные чтения от области памяти, известной как буфер; собственный входной API вызывают только, когда буфер пуст. Точно так же буферизованные потоки вывода пишут данные в буфер, и собственный выходной API вызывают только, когда буфер полон.
Программа может преобразовать небуферизованный поток в буферизованный поток, используя переносящуюся идиому, которую мы использовали несколько раз теперь, где небуферизованный потоковый объект передают конструктору для буферизованного потока class. Вот то, как Вы могли бы изменить вызовы конструктора в CopyCharacters пример, чтобы использовать буферизованный ввод-вывод:
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
16. Ввод и вывод текстовых данных. Абстрактные классы Reader и Writer. Связь между бинарными и текстовыми потоками.
Java-программы выполняют ввод/вывод через потоки. Поток является абстракцией, которая или производит, или потребляет информацию. Поток связывается с физическим устройством с помощью системы ввода/вывода Java (Java I/O system). Все потоки ведут себя одинаковым образом, хотя фактические физические устройства, с которыми они связаны, могут сильно различаться. Таким образом, одни и те же классы и методы ввода/вывода можно применять к устройствам любого типа. Это означает, что поток ввода может извлекать много различных видов входных данных: из дискового файла, с клавиатуры или сетевого разъема. Аналогично, поток вывода может обратиться к консоли, дисковому файлу или сетевому соединению (сокету).
Благодаря потокам, ваша программа выполняет ввод/вывод, не понимая различий между клавиатурой и сетью. Java реализует потоки с помощью иерархии классов, определенных в пакете java.io.
Символьные потоки определены в двух иерархиях классов. Наверху этой иерархии два абстрактных класса: Reader и Writer. Они обрабатывают потоки символов Unicode. В Java существуют несколько конкретных подклассов каждого из них. Классы Reader и Writer – наследники InputStream и OutputStream. Если с их помощью записывать или считывать текст, то сначала необходимо сопоставить каждому символу его числовой код. Такое соответствие называется кодировкой. Классы символьных потоков показаны в таблице.
Абстрактные классы Reader и Writer определяют несколько ключевых методов, которые реализуются другими поточными классами. Два самых важных метода — read() и write(), которые читают и записывают символы данных, соответственно. Они переопределяются производными поточными классами.
Известно, что Java использует кодировку Unicode, в которой символы представляются двухбайтным кодом. Байтовые потоки зачастую работают с текстом упрощенно – они просто отбрасывают старший байт каждого символа. В реальных же приложениях они могут использовать различные кодировки (даже для русского языка их существует несколько). Поэтому в версии Java 1.1 появился дополнительный набор классов, основывающийся на типах Reader и Writer.
Эта иерархия очень схожа с аналогичной для байтовых потоков InputStream и OutputStream. Главное отличие между ними – Reader и Writer работают с потоком символов (char). Только чтение массива символов в Reader описывается методом read(char[]), а запись в Writer – write(char[]).
В таблице приведены соответствия классов для байтовых и символьных потоков.
Байтовый поток | Символьный поток |
InputStream | Reader |
OutputStream | Writer |
ByteArrayInputStream | CharArrayReader |
ByteArrayOutputStream | CharArrayWriter |
Нет аналога | InputStreamReader |
Нет аналога | OutputStreamWriter |
FileInputStream | FileReader |
FileOutputStream | FileWriter |
FilterInputStream | FilterReader |
FilterOutputStream | FilterWriter |
BufferedInputStream | BufferedReader |
BufferedOutputStream | BufferedWriter |
PrintStream | PrintWriter |
DataInputStream | Нет аналога |
DataOutputStrea | Нет аналога |
ObjectInputStream | Нет аналога |
ObjectOutputStream | Нет аналога |
PipedInputStream | PipedReader |
PipedOutputStream | PipedWriter |
StringBufferInputStream | StringReader |
Нет аналога | StringWriter |
LineNumberInputStream | LineNumberReader |
PushBackInputStream | PushBackReader |
SequenceInputStream | Нет аналога |
17. Обработка строк. Считывание строк из потока и запись строк в поток. Разбор строк с разделителями, формирование строк. Классы PrintStream и Scanner.
Как и в большинстве других языков программирования, строка в Java – это последовательность символов. Но в отличие от многих языков, которые реализуют строки как символьные массивы, в Java строки реализуются как объекты типа String.
Каждая создаваемая строка в действительности является объектом типа String. Даже строчные константы – это фактически String-объекты. Например, в утверждении
System.out.println(“This is a String, too”);
строка “This is a String, too” является String -константой.
Для работы со строками определен класс String в стандартной библиотеке Java в пакете java.lang (этот пакет импортируется по умолчанию).
Конструкторы:
public String(); //создает пустую строку
public String(char value[ ]); //создает строку из массива символов
public String(byte bytes[ ]); //создает строку из массива байт
Для строк определена операция сложения, которая означает конкатенацию строк. Определена операция сложения с числом: сначала число преобразуется в строку, а потом соединяются строка с числом. Определена операция сложения строки с любым объектом. Для объекта вызывается метод toString, затем – конкатенация строк.
Изначальное предназначение PrintStream было в печати всех примитивных типов данных и объектов String в удобочитаемом формате. Он отличается от DataOutputStream, чья цель состоит в помещении элементов данных в поток таким способом, чтобы DataInputStream мог без труда реконструировать их.
Двумя важнейшими методами PrintStream являются print() и println(), которые перегружены для печати всех различных типов. Различия между print() и println() в том, что последний метод добавляет символ новой строки, когда завершен вывод.
Распространенный формат:
Вася Пупкин|MALE|35000|22
Иван Сидоров|MALE|40000|25
И т.д.
Запись:
class Employee {
...
public void writeData(PrintWriter out) {
out.println(getName() + "|"
+ gender + "|" + salary
+ "|" + age;
}
StringTokenizer разбивает строку на лексемы
• StringTokenizer(String s, String delim)
• boolean hasMoreTokens()
• String nextToken()
• int countTokens()
• StringTokenizer tokenizer = new StringTokenizer(line, "|");
• Employee e = new Employee(
tokenizer.nextToken(),
• Gender.valueOf(
tokenizer.nextToken()),
• Integer.parseInt(
tokenizer.nextToken()),
• Integer.parseInt(
tokenizer.nextToken())
•);
Класс scanner
Позволяет считывать из текстового файла или потока данные типов Java и строки
• Scanner(File file)
• Scanner(InputStream source)
• И т.д.
Методы:
• boolean hasNextLine()
• boolean hasNextInt()
• boolean hasNextDouble()
• И т.д.
• String nextLine()
• int nextInt()
• double nextDouble()
• И т.д.
18. Класс File. Работа с файлами. Сериализация объектов. Преимущество сериализации.
Для работы с физическим файлами и каталогами (директориями), расположенными на внешних носителях, в приложениях Java используются классы из пакета java.io.
Класс File служит для хранения и обработки в качестве объектов каталогов и имен файлов. Этот класс не содержит методы для работы с содержимым файла, но позволяет манипулировать такими свойствами файла, как права доступа, дата и время создания, путь в иерархии каталогов, создание, удаление файла, изменение его имени и каталога и т.д.
Объект класса File создается одним из нижеприведенных способов:
File myFile = new File(”\\com\\myfile.txt”);
File myDir = new File(”c:\\jdk1.6.0\\src\\java\\io”);
File myFile = new File(myDir, ”File.java”);
File myFile = new File(”c:\\com”, ”myfile.txt”);
File myFile = new File(new URI(” Интернет-адрес ”));
В первом случае создается объект, соответствующий файлу, во втором – подкаталогу. Третий и четвертый случаи идентичны. Для создания объекта указывается каталог и имя файла. В пятом – создается объект, соответствующий адресу
в Интернете.
При создании объекта класса File любым из конструкторов компилятор не выполняет проверку на существование физического файла с заданным путем.
Процесс преобразования объектов в потоки байтов для хранения называется сериализацией. Процесс извлечения объекта из потока байтов называется десериализацией.
19. Исключения. Классификация исключений. Генерация исключений.
Эта статья посвящается очень важному вопросу программирования - исключительным ситуациям и ошибкам (exceptions and errors).
В языке Java исключения (Exceptions) и ошибки (Errors) являются объектами. Когда метод вызывает (бросает - throws) исключительную ситуацию, он на самом деле работает с объектом. Но такое происходит не с любыми объектами, а только с теми, которые наследуются от Throwable.
Упрощенную диаграмму классов ошибок и исключительний вы можете увидеть на следующем рисунке:
20. Исключения. Перехват исключений. Блоки try…catch…finally.
Перехват исключений
Если есть код, вызывающий исключение, должен быть код, его обрабатывающий.
Блок try...catch:
try {
... * Если возникает исключение, оставшаяся часть кода пропускается*
} catch (тип_исключения e) {
обработчик исключения данного типа * Блок перехвата исключения игнорируется, если исключения данного типа не произошло
*
}
Дата добавления: 2015-10-29; просмотров: 150 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
События. Виды событий. Иерархия классов событий. Команда и источник. Адаптеры. (читаем картинки слева направо, потом на новую строку) | | | Создание собственных классов в Java (продолжение), инкапсуляция, полиморфизм |