Графічні бібліотеки java. Короткий огляд GUI-фреймворків для Java і моя перша простенька GUI-додаток на Swing

Отже, логіка Game of Life реалізована. Хотілося б насолодитися процесом споглядання різноманіття форм «Життя» на моніторі. Що для цього знадобиться?

Саме вікно з меню та кнопками, а також його поведінка створюватимуться за допомогою бібліотеки Swing.Промальовування процесу еволюції нашого «Життя» — за допомогою бібліотеки AWT(точніше, Java 2D). Це два основних пакети для створення графічних інтерфейсів Java.

Робота AWT спочатку ґрунтується на так званих peer-інтерфейсах. Суть полягає в тому, що при необхідності виведення на екран об'єкта Java операційною системою створюється парний йому графічний об'єкт, який, власне, і відображається. Ці об'єкти взаємодіють між собою під час роботи програми. Така реалізація призводить до того, що кожної платформи доводиться випускати власний JDK.

Пізніше в AWT були створені компоненти, які не використовують peer-інтерфейси - "легкі" (lightweight) компоненти. Бібліотеку цих компонентів було названо Swing. Тобто Swing, насправді, є розширенням AWT.

Сама ж AWT була доповнена новими засобами малювання та виведення зображень, що отримали назву Java 2D.

Перерахую із коротким описом основні елементи Swing.

Базовим будівельним блоком усієї бібліотеки візуальних компонентів Swing є JComponent. Це суперклас кожного компонента. Він є абстрактним класом, тому насправді ви не можете створити JComponent, але він містить буквально сотні функцій, які кожен компонент Swing може використовувати як результат ієрархії класів.

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

JMenu/JMenuItem/JMenuBar— призначені для розробки системи меню JFrame. Основою будь-якої системи меню є JMenuBar, кожен JMenu та JMenuItem створюється з ним. JMenu є підкласом JMenuItem. Однак на вигляд вони мають відмінність: JMenu використовується для утримання інших JMenuItem і JMenu; JMenuItem під час вибору активізує дію.

JLabel(мітка) – призначений для опису (текстового чи графічного) інших елементів.

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

JTextField(текстове поле) — дозволяє користувачеві вводити текстові дані, які можна обробити у програмі.

JTextAreaрозвиває JTextField, дозволяючи вводити кілька рядків.

JPasswordField(поле для введення пароля) — різновид JTextField, що дозволяє приховувати символи, що вводяться.

JComboBox(комбінований список) — дозволяє користувачеві вибрати елемент із існуючого списку (або додати новий елемент до списку).

JCheckBox(прапорець)і JRadioButton(перемикач) – надають користувачеві варіанти для вибору. JRadioButton зазвичай групуються разом для надання користувачеві питання з примусовою відповіддю (відповіді взаємовиключні – може бути лише одна відповідь на запитання). Як тільки ви вибрали JRadioButton, ви не можете зняти його позначку, доки не виберете інший варіант з групи. JCheckBox працює інакше. Він дозволяє відзначати/знімати позначку з варіанта у будь-який час та вибирати кілька відповідей на запитання. Класом, який дозволяє групувати разом компоненти JCheckBox чи JRadioButton, є клас ButtonGroup.

JSlider- Елемент для вибору числового значення з графічно представленого діапазону.

JSpinner -призначений для вибору групи значень. У цьому він аналогічний JComboBox, хоча їх використання не повинно бути взаємозамінним. Ви повинні використовувати JSpinner тільки для логічно послідовних варіантів – числа та дати ідеально підходять для цього. JComboBox, з іншого боку, більше гарний вибірдля уявлення випадкових варіантів, які не мають взаємозв'язку між собою.

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

JToolTip— це невеликі «бульбашки», які виринають, коли ви наводите і тримаєте курсор мишки над чимось. Вони можуть бути дуже корисні в програмах, надаючи підказки для елементів, деталізуючи інформацію або навіть показуючи повний текст елемента в стислих UI. Вони активуються в Swing, якщо залишити курсор мишки над компонентом певну кількість часу; зазвичай вони з'являються приблизно через секунду після зупинки мишки і залишаються видимими, поки курсор залишається над компонентом.

JOptionPane— клас для надання UI-розробникам способу надання простих повідомлень (про помилку або іншу інформацію) та швидкого отримання даних (наприклад, імені або номера).

JScrollPane - Swing-компонент для обробки всіх дій прокручування.

JListє корисним компонентом для надання користувачеві багатьох варіантів вибору. Ви можете представляти його як розширення JComboBox. JList надає більше варіантів та додає можливість вибору кількох варіантів. Вибір між JList і JComboBox часто полягає в наступному: якщо вам потрібна можливість множинного вибору або є більш ніж 15 варіантів (хоча це число не є загальним правилом), ви повинні завжди вибирати JList. Ви повинні використовувати JList спільно з JScrollPane, оскільки він може надавати більше варіантів, ніж міститься у видимій області. JList має також модель вибору, яку ви можете встановити у різні типивибору варіантів. Такими типами є: одиночний вибір (ви можете вибрати тільки один варіант), одиночний інтервал (ви можете вибрати суміжні варіанти, але в будь-якій їх кількості) та множинний інтервал (ви можете вибрати будь-яку кількість варіантів у будь-яких комбінаціях).

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

Java AWT

Першою спробою Sun створити графічний інтерфейс для Java була бібліотека AWT(Abstract Window Toolkit) - інструментарій для роботи з різними віконними середовищами. Sun зробив прошарок на Java, який викликає методи з бібліотек, написаних на С. Бібліотечні методи AWT створюють і використовують графічні компоненти операційного середовища. З одного боку, це добре, тому що програма на Java схожа на інші програми в рамках однієї ОС. Але при запуску її на іншій платформі можуть виникнути відмінності у розмірах компонентів та шрифтів, які псуватимуть зовнішній виглядпрограми.

Щоб забезпечити мультиплатформеність AWTінтерфейси викликів компонентів були уніфіковані, внаслідок чого їхня функціональність вийшла трохи урізаною. Та й набір компонентів вийшов досить невеликий. Так, наприклад, в AWT немає таблиць, а в кнопках не підтримується відображення іконок. Проте пакет java.awtвходить у Java з першого випуску і його можна використовуватиме створення графічних інтерфейсів.

Таким чином, компоненти AWTне виконують жодної "роботи". Це просто Java-оболонка для елементів управління тієї операційної системи, на якій вони працюють. Всі запити до цих компонентів перенаправляються до операційної системи, яка виконує всю роботу.

Використані ресурси AWTнамагається звільняти автоматично. Це трохи ускладнює архітектуру та впливає на продуктивність. Написати щось серйозне з використанням AWT буде важко. Зараз її використовують хіба що для аплетів.

Основні концепції SWING

Слідом за AWT Sun розробила графічну бібліотеку компонентів Swingповністю написану на Java. Для малювання використовується 2D, що принесло із собою відразу кілька переваг. Набір стандартних компонентів значно перевершує AWT за різноманітністю та функціональністю. Swing дозволяє легко створювати нові компоненти, наслідуючи існуючі, і підтримує різні стилі та скіни.

Творці нової бібліотеки інтерфейсу користувача Swingне стали «винаходити велосипед» і як основу для своєї бібліотеки вибрали AWT. Звичайно, не йшлося про використання конкретних великовагових компонентів AWT (представлених класами Button, Label та їм подібними). Потрібну ступінь гнучкості та керованості забезпечували лише легковагі компоненти. На діаграмі успадкування представлений зв'язок між AWT та Swing.

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

Swing контейнери найвищого рівня

Для створення графічного інтерфейсудодатки необхідно використовувати спеціальні компоненти бібліотеки Swing, які називаються контейнерами вищого рівня (top level containers). Вони являють собою вікна операційної системи, в яких розміщуються компоненти інтерфейсу користувача. До контейнерів найвищого рівня відносяться вікна JFrame і JWindow, діалогове вікно JDialog, також аплет JApplet (який не є вікном, але також призначений для виведення інтерфейсу в браузері, що запускає цей аплет). Контейнери вищого рівня Swing є важкими компонентами і є винятком із загального правила. Решта компонентів Swing є легковагими.

Простий Swingприклад створення віконного інтерфейсу JFrame.

Import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JLabel; public class JFrameTest ( public static void createGUI() ( JFrame frame = new JFrame("Test frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("Test label"); frame.getContent add(label);frame.setPreferredSize(new Dimension(200, 100));frame.pack();frame.setVisible(true); ) swing.SwingUtilities.invokeLater(new Runnable() ( public void run() ( createGUI(); ) )); ) )

Конструктор JFrame()без параметрів створює пусте вікно. Конструктор JFrame(String title)створює порожнє вікно із заголовком title. Щоб створити найпростішу програму з порожнім вікном, необхідно використовувати такі методи:

  • setSize(int width, int height) – визначення розмірів вікна;
  • setDefaultCloseOperation(int operation) – визначення дії при завершенні програми;
  • setVisible(boolean visible) – зробити вікно видимим.

Якщо не визначити розміри вікна, воно буде мати нульову висоту незалежно від того, що в ньому знаходиться. Розміри вікна включають не тільки "робочу" область, але і межі та рядок заголовка.

Метод setDefaultCloseOperation визначає дію, яку потрібно виконати при "виході з програми". Для цього слід як параметр operation передати константу EXIT_ON_CLOSE, описану в класі JFrame.

За замовчуванням вікно створюється невидимим. Щоб відобразити вікно на екрані, викликається метод setVisible з параметром true. Якщо викликати його із параметром false, вікно стане невидимим.

Графічний інтерфейс java swingприклад створення вікна JFrameпредставлений на наступному малюнку.

Для підключення бібліотеки Swingу програмі необхідно імпортувати бібліотеку javax.swing.

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

Коренева паль JRootPaneдодає в контейнери властивість "глибини", забезпечуючи можливість не тільки розміщувати компоненти один над іншим, але й за необхідності міняти їх місцями, збільшувати або зменшувати розташування компонентів. Така можливість необхідна при створенні багатодокументної програми Swing, У якого вікна представляють легковагі компоненти, що розташовуються один над одним, а також випадають (контекстними) меню і підказками.

На наступному малюнку наочно представлена ​​структура кореневої панелі JRootPane.

Коренева панель JRootPaneє контейнером, успадкованим від базового класу Swing JComponent. У цьому контейнері за розташування компонентів відповідає спеціальний менеджер розташування, реалізований у внутрішньому класі RootPaneLayout. Цей менеджер розташування відповідає за те, щоб усі складові кореневої панелі розміщувалися так, як їм слід: багатошарова панель займає весь простір вікна; у її шарі FRAME_CONTENT_LAYER розташовуються рядок меню і панель вмісту, а над цим розташовується прозора панель.

Усі складові кореневої панелі JRootPaneможна отримати чи змінити. Для цього вона має набір методів get/set. Програмним способом JRootPaneможна отримати за допомогою методу getRootPane().

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

Багатошарова панель JLayeredPane

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

JLayeredPaneвикористовується для додавання до контейнера властивості глибини (depth). Тобто багатошарова панель дозволяє організувати в контейнері третій вимір, вздовж якого розташовуються шари (layers) компонента. У звичайному контейнері розташування компонента визначається прямокутником, який показує, яку частину контейнера займає компонент. При додаванні компонента в багатошарову панель необхідно вказати як прямокутник, займаний компонентом, а й шар, у якому він розташовуватися. Шар у багатошаровій панелі визначається цілим числом. Чим більше визначальне шар число, тим вище шар.

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

Можливості багатошарової панелі широко використовуються деякими компонентами Swing. Особливо вони важливі для багатодокументних програм, спливаючих підказок та меню. Багатодокументні Swingдодатки використовують спеціальний контейнер JDesktopPane(«робочий стіл»), успадкований від JLayeredPane, де розташовані внутрішні вікна Swing. Найкращі важливі функціїбагатодокументної програми - розташування «активного» вікна з інших, згортання вікон, їх перетягування - забезпечуються механізмами багатошарової панелі. Основна перевага від використання багатошарової панелі для спливаючих підказок та меню – це прискорення їхньої роботи. Замість створення для кожної підказки або меню нового вагового вікна, що розташовується над компонентом, в якому виник запит на виведення підказки або меню, Swingстворює швидкий легковажний компонент. Цей компонент розміщується в досить високому шарі багатошарової панелі вище в стопці інших компонентів і використовується для виведення підказки або меню.

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

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

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

Шар Modal планувався для розміщення легковажних модальних діалогових вікон. Однак такі діалогові вікна поки не реалізовані, тому цей шар в Swing в даний час не використовується.

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

Найвищий шар. Призначений для операцій перетягування (drag and drop), які мають бути добре помітні в інтерфейсі програми.

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

Import javax.swing.*; import java.awt.*; // клас малювання двох типів фігур з текстом class Figure extends JComponent (private static final long serialVersionUID = 1L; private Color color; private int type; private String text; // параметри: колір і тип фігури ( this.color = color; this.type = type; ) ( // промальовування фігури g.setColor(color); switch (type) ( case 0: g.fillOval(0, 0, 90, 90); break; case 1: g.fillRect(0, 0, 130, 80) ); break; ) g.setColor(Color.yellow); g.drawString(text, 10, 35); ) ) super("Example LayeredTest"); // вихід при закритті вікна setDefaultCloseOperation(EXIT_ON_CLOSE); // визначення багатошарової панелі JLayeredPane lp = getLayeredPane(); // створення трьох фігур Figure figure1 = new Figure(Color.red , , popup"); Figure figure2 = new Figure(Color.blue, 0, "Figure 1"); (10, 40, 12 0, 120); figure2.setBounds(60, 120, 160, 180); figure3.setBounds(90, 55, 250, 180); // додавання фігур до різних шарів lp.add(figure1, JLayeredPane.POPUP_LAYER); lp.add(figure2, JLayeredPane.PALETTE_LAYER); lp.add(figure3, JLayeredPane.PALETTE_LAYER); // Зміна позиції однієї з фігур lp.setPosition(figure3, 0); // Визначення розміру та відкриття вікна setSize (280, 250); setVisible(true); ) public static void main(String args) ( JFrame.setDefaultLookAndFeelDecorated(true); new JLayeredPaneTest(); ) )

У прикладі створюється маленьке вікно JFrameі до багатошарової панелі додається кілька компонентів Figure. Щоб отримати багатошарову панель у будь-якому контейнері Swing найвищого рівня, достатньо викликати метод getLayeredPane().

Допоміжний клас Figure успадковує властивості базового класу JComponent та дозволяє різними кольорами малювати фігури двох типів (круги та прямокутники). Параметри для промальовування фігур задаються у конструкторі класу.

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

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

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

Панель вмісту ContentPane

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

Звернутися до панелі вмісту можна методом getContentPane()класу JFrame. За допомогою методу add(Component component) можна додати будь-який елемент управління. Замінити ContentPaneбудь-якою іншою панеллю типу JPanel можна методом setContentPane()

Приклад додавання кнопки до панелі вмісту:

JButton newButton = new JButton(); getContentPane().add(newButton);

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

Панель вмісту можна повністю замінити. Розглянемо наступний Swingприклад використання панелі вмісту ContentPane.

Import javax.swing.*; public class ContentPaneReplace extends JFrame ( private static final long serialVersionUID = 1L; public ContentPaneReplace() ( super("Test ContentPane"); setDefaultCloseOperation(EXIT_ON_CLOSE); // Створення панелі з двома кнопками JPanel (new JButton("Сім'я")); contents.add(new JButton("Школа")); // Заміна панелі вмісту setContentPane(contents); // Визначення розміру вікна setSize(200, 100); // Відкриття вікна setVisible (true); ) public static void main(String args) ( JFrame.setDefaultLookAndFeelDecorated(true); new ContentPaneAdd(); ) )

У прикладі створюється невелике вікно та панель із двома кнопками, яка потім методом setContentPane()замінює панель вмісту вікна. Таким чином, була використана заміна замість більш простого додавання - виклику методу add(). Інтерфейс вікна представлений на скриншоті.

Панель вмісту ContentPaneсама собою не уявляє нічого особливого. Необхідно лише пам'ятати, що компоненти додаються саме до неї.

Прозора панель JOptionPane

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

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

У яких випадках можна використовувати прозору панель JOptionPane? З її допомогою можна визначати функції програми, для реалізації яких «з нуля» знадобилися серйозні зусилля. Прозору панель можна пристосувати під автоматизоване тестування інтерфейсу користувача. Синтезовані в ній події дозволяють відстежувати проміжні результати налагодження. Іноді такий підхід набагато ефективніший за ручне тестування.

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

Приклад використання прозорої панелі Swing JOptionPane:

// Використання прозорої панелі JOptionPane import java.awt.Dimension; import java.awt.Font; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.UIManager; public class JOptionPaneTest extends JFrame ( private static final long serialVersionUID = 1L; public static final Font FONT = new Font("Verdana", Font.PLAIN, 11); public static void createGUI() ( JFrame frame = new JFrame("T est "); Frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); windowDeiconified(WindowEvent event) () public void windowIconified(WindowEvent event) () public void windowOpened(WindowEvent event) () public void windowClosing(WindowEvent event) ( Object options = ("Так", "Н! JOptionPane.showOptionDialog(event.getWindow(), "Закрити вікно?", "Підтвердження", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options); if(rc == 0) (false); System.exit(0); ) ) )); JLabel label = new JLabel("Використання прозорої панелі при закритті вікна"); frame.getContentPane().add(label); frame.setPreferredSize(new Dimension(350, 80)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); ) public static void main(String args) ( javax.swing.SwingUtilities.invokeLater(new Runnable() ( public void run() ( UIManager.put("Button.font", FONT); UIManager.put("Label.font ", FONT); JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); createGUI(); ) ));

Якщо методу setDefaultCloseOperation передати константу JFrame.EXIT_ON_CLOSE, то при закритті вікна програма припинятиме роботу. У прикладі цього методу передається константа JFrame.DO_NOTHING_ON_CLOSEщоб при закритті вікна нічого не відбувалося. Вихід із програми у прикладі здійснюється з JFrame слухача WindowListener у методі windowClosing. При закритті вікна викликається метод windowClosing із параметром WindowEvent event, який у прозорій панелі Swing JOptionPane відкриває діалогове вікно підтвердження.

На наступному скріншоті представлено два вікна програми. Верхнє головне вікно. При закритті вікна відкривається нижнє діалогове вікно підтвердження наміру.

Рядок меню JMenuBar

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

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

Коренева панель стежить, щоб панель вмісту та рядок меню JMenuBarне перекривалися. Якщо рядок меню не потрібний, коренева панель використовує весь простір для розміщення панелі вмісту.

Приклади Swing

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

Попередження

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

Цього, на жаль, уникнути, т.к. рано чи пізно ми повинні будемо прийти до такої точки, після якої підхід «на пальцях» стає вже неспроможним. Нині такий момент настає. Так що давайте зберемося з духом, засукаємо рукави і приступимо.

На попередньому занятті () ми сформували і вивели на екран монітора графічне вікно і попутно вирішили деякі завдання щодо його зовнішнього вигляду і розташування. Тепер ми обговоримо те, що залишилося за кадром.

Ви, ймовірно, звернули увагу на те, що на початку вихідного коду є два наступні рядки:

import java.awt.*;

import javax.swing.*;

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

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

Пакети включають необхідні класи та інтерфейси (про інтерфейси ми розповімо свого часу), що забезпечують ту чи іншу функціональність майбутнього додатка. Наявність зірочки («*») вказує на те, що програміст імпортує весь вміст пакета, без точної вказівкивходять до нього класів чи інтерфейсів. Може здатися, що у разі великих пакетів, підсумковий об'єктний код може виявитися надто великим, але турбуватися не варто: компілятор Java достатньо розумний, щоб використовувати тільки те, що дійсно необхідно вашій програмі; все, що програмі не потрібно, компілятор включати в об'єктний код просто не стане. Якщо хочете, ви можете використовувати іншу форму підключення пакетів, наприклад,

import java.awt.Window;

import javax.swing.JFrame;

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

Імпортування (підключення) пакета до програми, що розробляється, проводиться ключовим словом import, після якого йде ім'я пакета. Кожен пакет повинен імпортуватися окремо (тобто не можна написати import java.awt.*, javax.swing.*;). Звичайно, обсяг вихідного коду при цьому дещо збільшується, але незначно. Всі класи та інтерфейси, що становлять вашу програму, повинні розташовуватися строго після конструкцій import, інакше компілятор згенерує повідомлення про помилки компіляції.

Перший пакет (починається з java.awt) забезпечує насамперед взаємодію програм на Java з графічною підсистемою операційної системи. Згадайте, що Java є кросплатформною мовою програмування і генерує єдиний об'єктний код незалежно від операційної системи, на якій цей код виконуватиметься. Тому Java «вимушена» звертатися до ресурсів, що надаються операційною системою, яка встановлена ​​на комп'ютері користувача. Один з таких ресурсів – графіка (крім графіки Java звертається до «послуг» операційної системи для доступу до файловій системіта інших ресурсів). Так ось, пакет java.awt.* дозволяє графічним інтерфейсам, написаним на Java задіяти графічні можливості операційної системи та відображатися графічним об'єктам, створеним у програмах Javaна екрані монітора. Тут ми трохи затримаємось.

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

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

JButton buttonPressMe = new JButton («Натисні мене»);

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

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

Dimension sSize=Toolkit.getDefaultToolkit().getScreenSize()

Що може надати таку інформацію? Операційна система і лише вона! Далі ми використовували код

try (UIManager.setLookAndFeel

(UIManager.getSystemLookAndFeelClassName());

catch (Exception lfe) ()

для того, щоб зовнішній вигляд вікна відповідав стандарту, прийнятому в конкретній операційній системі. Що може надати таку інформацію? Знову ж таки – операційна система! Тож для створення графічних інтерфейсів без пакета java.awt.* нам не обійтися.

При виведенні вікна на екран операційна система виділяє вікна потрібні ресурси (насамперед – пам'ять) і вікно стає видимим. Далі в справу вступають легковажні компоненти та вся подальша роботаздійснюється практично лише з ними.

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

Public class MoneyForNothing extends JFrame (

Тут новими є два елементи: ключове слово extends і JFrame.

Ключове слово extends (у перекладі означає "розширити", але за змістом близько до слова "успадковує" або до словосполучення "запозичувати властивості та поведінку") висловлює фундаментальну концепцію об'єктно-орієнтованого програмування (або простіше кажучи, програмування, заснованого на класах). Ця концепція зветься «успадкування». З цим треба добре розібратися.

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

Звичайно, величезний дизель для танкера не порівняти з крихітним спиртовим двигуном для авіамоделі, але вони (якщо так можна сказати) – нехай і далекі, але родичі. У них загальний предок - абстрактний двигун, а самі двигуни - його нащадки (нехай навіть дуже і дуже далекі).

У програмуванні такий предок зазвичай називається «батько» чи «суперклас», тобто. клас, від якого походять інші класи. Назва суперкласу вказується безпосередньо після extends. Таким чином, у перекладі на звичайну мову, наведений вище фрагмент коду можна прочитати так: «клас... розширює клас JFrame», «клас... успадковує клас JFrame» або «клас... запозичує властивості і поведінку класу JFrame». У класі JFrame визначено основні властивості та поведінку «стандартних» графічних вікон. Сам клас JFrame знаходиться в пакеті javax.swing.* і саме його ми імпортували на початку програми.

JFrame – це батько (в термінології Java – суперклас) графічних вікон (є ще й інші вікна, наприклад, діалогові, але про них ми поговоримо свого часу). Якщо звернутися до документації по Java, то в ній ви виявите, що в класі JFrame є кілька конструкторів, полів та близько двох десятків методів, які визначають поведінку якогось «стандартного» вікна. Таким чином, наш клас з ім'ям MoneyForNothing є спадкоємцем класу JFrame (зазвичай говорять не про спадкоємців, а про нащадків або про дочірні класи).

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

Щоб не повертатися до цього питання, звертаємо вашу увагу, що у вершині ієрархії успадкування Java лежать класи з пакета java.lang.*. Це єдиний пакет JDK, який не потрібно явно імпортувати - він завжди імпортується автоматично. Судячи з цієї «драбинки», клас JFrame є пра-правнуком java.lang.Object (картинка, наведена вище по-науковому називається ієрархією класів).

Всі компоненти графічного інтерфейсу користувача (скорочено GUI, від Graphical User Interface), які, нагадаємо, є легковажними елементами, повинні бути розміщені всередині основного вікна - спадкоємця JFrame. Зараз у нас ніяких компонентів немає, але вони з'являться – обіцяємо.

А тепер «пробіжимося» наостанок на нашу вихідного коду, який виглядає так:

// Конструктор

public MoneyForNothing () (

setTitle ("Ласкаво просимо до Money for Nothing");

setSize (new Dimension (600, 400));

Dimension sSize = Toolkit.getDefaultToolkit().getScreenSize(),

fSize = getSize();

if (fSize.height > sSize.height) (fSize.height = sSize.height;)

if (fSize.width > sSize.width) (fSize.width = sSize.width;)

setLocation ((sSize.width - fSize.width)/2,

(sSize.height - fSize.height) / 2);

setDefaultCloseOperation (EXIT_ON_CLOSE);

setVisible (true);

Насамперед, ми задаємо заголовок вікна (метод setTitle («...»)). Потім задаються розміри вікна по горизонталі та вертикалі (метод setSize (...)). Після визначення роздільної здатності екрана монітора розраховуються координати верхнього лівого кута нашого вікна та вікно виводиться (метод setLocation (...)) у вказаному місці екрана.

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

Нарешті, останній рядок (метод setVisible (true)) робить вікно видимим.

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

На цьому наше заняття добігає кінця. Найважливіше, що ви маєте витягти з нього – концепція спадкування (запозичення). Це справді основна концепція. Без неї в Java не можна створити скільки-небудь складну і корисну програмутак що не поспішайте рухатися далі, а ще раз уважно перегляньте і обдумайте все, що ми до цього моменту вивчили.

Успіху і до швидкої зустрічі!

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

І так, які інструменти нам потрібні:

  • Java Virtual Machine (OpenJDK або Oracle JDK)
  • Intellij IDEA (або інше IDE для Java)

Після встановлення необхідного софту, відкриваємо Intellij IDEAі створюємо новий проект: File -> New Project…

Я назвав проект guiBase. Як видно на скрині, папка srcне містить нічого, тому створюємо в ній наш головний клас, який містить функцію main.

Public class Main ( public static void main(String args) ( System.out.println("Hello, Govzalla!"); ) )

Зміст головного класу бачите вище. Ми вже зараз можемо створити проект ( Build project ) і запустити його ( Run ). Внизу в вашому терміналі IDEви побачите повідомлення "Hello, Govzalla!". Але як ви самі зрозуміли – GUI він не підтримує.

На даному етапіу нас вже є працююча програма, але без підтримки GUI. А зараз у тій самій папці srcстворимо GUI Form: New -> GUI Form

Відкриваємо створену GUI форму, натискаємо на JPanelі задаємо його ідентифікатор у полі field nameя задав panel.

Після чого перетягуємо на форму з правого боку JTextField, JPasswordFieldі JButton:

Залишилося додати код та зв'язати нашу форму з ним. Коли ми додавали форму MainWindow, автоматично створився і клас MainWindow, цей клас є класом створеної форми, тобто. саме цей клас обслуговуватиме всі події цієї форми.

Хоча клас нашого вікна містить необхідні елементиале навіть зараз він не має нічого спільного з GUI, тому розширимо його за допомогою JFrameі успадкуємо всю основну та необхідну функціональність GUI .

В Наразіми маємо форму MainWindowта клас MainWindowрозширений за допомогою JFrame. Зараз нам необхідно визначити всі додані GUI елементи як зміст класу MainWindow this.getContentPane().add(panel); Після чого вміст файлу MainWindow.java буде змінено так:

Import javax.swing.*; public class MainWindow extends JFrame ( private JTextField textField1; private JPasswordField passwordField1; private JButton button1; private JPanel panel; public MainWindow() ( this.getContentPane().add(panel); )

Якщо спробуєте запустити код, ви знову побачите те саме повідомлення “Hello, Govzalla!“. Справа в тому, що ми створили клас та форму до нього, але не створили інстанцію цього класу.

Настав час змінити файл Main.java і додати туди код створення нашого GUI:

Import java.awt.*; public class Main ( public static void main(String args) ( // Створюємо інстанцію класу MainWindow MainWindow mainWindow = new MainWindow(); // Упаковуємо всі елементи з нашої форми mainWindow.pack(); // Змінюємо розміри вікна mainWindowsetSi new Dimension(200, 200));// Відображаємо створене вікно mainWindow.setVisible(true); ) )

Запускаємо код

Натиснувши кнопку Button ви помітите, що програма ніяк не реагує. Справа в тому, що ми ще не додали слухач ( Listener) для подій ( Events) кнопки Button.

Слухач подій ( Event listener) JButtonмає бути імплентацією адаптера ActionListenerтому додамо наступний код в тіло класу MainWindow:

Private class MyButtonListener implements ActionListener ( @Override public void actionPerformed(ActionEvent actionEvent) ( ) )

Метод actionPerformed() буде обробляти всі події кнопки button1, але спочатку ще необхідно вказати кнопці button1 який клас буде обробляти, тому додамо наступний код в конструктор класу MainWIndow: this.button1.addActionListener(new MyButtonListener()); Щоб наш обробник не був безглуздим додамо наступний код метод actionPerformed():

@Override public void actionPerformed(ActionEvent actionEvent) ( if (textField1.getText().equals(passwordField1.getText())) ( JOptionPane.showMessageDialog(null, "Success"); ) else ( JOptionPane.sa "); )

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

Надіслати свою гарну роботу до бази знань просто. Використовуйте форму, розташовану нижче

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

Розміщено на http://www.allbest.ru/

ВСТУП

Останні кілька років розробники докладали безліч зусиль, щоб інтегрувати графіку та анімацію у свої аплети та програми Java. Використовуючи інтерфейси прикладного програмування java.awt і javax.swing, розробники можуть реалізовувати набагато складніші графічні програми, включаючи ігри, зберігачі екрану, екранні заставки та тривимірний графічний інтерфейс користувача.

Мета роботи. Розрахунково-графічна робота присвячена побудові додатків з використанням графічного інтерфейсу бібліотек java.awt та javax.swing.

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

1. ПОСТАНОВКА ЗАДАЧІ

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

AWT (для доступу завантажується пакет java.awt) містить набір класів, що дозволяють виконувати графічні операції та створювати віконні елементи управління, подібно до того, як це робиться в VBA та Delphi;

Swing (для доступу завантажується пакет javax.swing) містить нові класи, переважно аналогічні AWT. До імен класів додається J (JButton, JLabel та ін.).

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

import javax. swing.*;

public final class HelloWorld implements Runnable (

public static void main(String args) (

//Swing має власний керуючий потік (т.зв. dispatching thread),

//який працює паралельно з основним (у якому виконується main())

// Потоком. Якщо основний потік закінчить роботу (метод main завершиться),

//Потік, що відповідає за роботу Swing-інтерфейсу може продовжувати свою роботу.

//І навіть якщо користувач зачинив усі вікна, програма продовжить свою роботу

//(Доки живий даний потік). Починаючи з Java 6, коли всі

//компоненти знищені, керуючий потік зупиняється автоматично.

//Запускаємо весь код, що працює в потоці управління, навіть ініціалізацію:

SwingUtilities.invokeLater (New HelloWorld());

public void run() (

// Створюємо вікно із заголовком "Hello, World!"

Frame f = new JFrame ("Hello, World!");

// Раніше практикувалося наступне: створювався listener та реєструвався

// на екземплярі головного вікна, який реагував на windowClosing()

// Примусовою зупинкою віртуальної машинивикликом System.exit()

// Тепер є більш "правильний" спосіб задавши реакцію на закриття вікна.

// Цей спосібзнищує поточне вікно, але не зупиняє програму. Тим

// Додаток буде працювати поки не будуть закриті всі вікна.

f.setDefaultCloseOperation (JFrame. DISPOSE_ON_CLOSE);

// однак можна поставити і так:

// f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

// Додаємо на панель вікна компонент, що не редагується, з текстом.

// f.getContentPane().add (new JLabel("Hello, World!")); - Старий стиль

f.add(new JLabel("Hello World"));

// pack() "упаковує" вікно до оптимального розміру

// всіх розміщених у ньому компонентів.

// Показати вікно

f.setVisible(true);

Технологія Swing надає механізми управління наступними аспектами представлення:

Клавіатура (Swing надає спосіб перехоплення введення користувача);

Кольори (Swing надає спосіб змінювати кольори, які ви бачите на екрані);

Текстове поле для введення (Swing пропонує текстові компоненти для обробки всіх повсякденних завдань).

JComponent

Базовим класом усієї бібліотеки візуальних компонентів Swing є JComponent. Це суперклас інших візуальних компонентів. Він є абстрактним класом, тому насправді ви не можете створити JComponent, але він містить сотні функцій, які кожен компонент Swing може використовувати як результат ієрархії класів. Клас JComponent забезпечує інфраструктуру фарбування для всіх компонентів, він знає, як обробляти всі натискання клавіш на клавіатурі, його підкласи, отже, повинні лише прослуховувати певні клавіші. Клас JComponent також містить метод add(), який дозволяє додати інші об'єкти класу JComponent, так можна додати будь-який Swing-компонент до будь-якого іншого для створення вкладених компонентів (наприклад, JPanel, що містить JButton, або навіть більш химерні комбінації, наприклад JMenu, що містить JButton ).

JLabel

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

get/setText() - отримати/встановити текст у позначці;

get/setIcon() - отримати/встановити зображення у позначці;

get/setHorizontalAlignment - отримати/встановити горизонтальну позицію тексту;

get/setDisplayedMnemonic() - отримати/установити мнемоніку (підкреслений символ) для мітки;

get/setLabelFor() - отримати/встановити компонент, до якого приєднана ця мітка; коли користувач натискає комбінацію клавіш Alt + мнемоніка, фокус переміщається на вказаний компонент.

JButton

Основним активним компонентом у Swing є Jbutton.

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

get/setText() - отримати/встановити текст у кнопці;

get/setIcon() - отримати/встановити зображення у кнопці;

get/setHorizontalAlignment() - отримати/встановити горизонтальну позицію тексту;

get/setVerticalAlignment() - отримати/встановити вертикальну позицію тексту;

get/setDisplayedMnenomic() - отримати/встановити мнемоніку (підкреслений символ), яка у комбінації з кнопкою Alt викликає натискання кнопки.

JFrame

Клас JFrame є контейнером, що дозволяє додавати до себе інші компоненти для їх організації та надання користувачеві.

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

get/setTitle() - отримати/встановити заголовок кадру;

get/setState() - отримати/встановити стан кадру (мінімізувати, максимізувати тощо);

is/setVisible() - отримати/встановити видимість кадру, тобто відображення на екрані;

get/setLocation() - отримати/встановити розташування у вікні, де кадр повинен з'явитися;

get/setSize() - отримати/встановити розмір кадру;

add() - додати компоненти до кадру.

Схеми, моделі та події

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

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

події (event). Програма повинна реагувати на натискання клавіш, натискання кнопки миші та все інше, що користувач може зробити.

Моделі. Для більш просунутих компонентів (списки, таблиці, дерева) і навіть для деяких більш простих, наприклад JComboBox, моделі - це найефективніший спосіб роботи з даними. Вони видаляють більшу частину роботи з обробки даних із самого компонента (згадайте MVC) і надають оболонку для загальних об'єктних класів даних (наприклад, Vector та ArrayList).

Особливу увагу, у зв'язку з необхідністю зображення динамічних сцен на візуальних компонентах, необхідно приділити класу Graphics 2D.

Індивідуальне завдання розрахунково-графічної роботи: Зобразити у вікні програми відрізок, що обертається у площині кадру навколо точки, що рухається відрізком.

графічний інтерфейс java компонент

2. РЕАЛІЗАЦІЯ ЗАДАЧІ МОВИ ВИСОКОГО РІВНЯJAVA

import java.awt.*;

import java.awt.geom.*;

import java.awt.image.BufferedImage;

* Завдання 4. Зобразитив вікні програми (аплета) відрізок, обертаєтьсяв

* площині кадр навколо точки що рухається по відрізку.

public class LB4 extends java.applet.Applet implements Runnable (

private static final long serialVersionUID= 1L;

private int w, h;

private BufferedImage bi;

private Graphics2D big;

private boolean stop=false;

private Thread timer = null;

private Color fonColor = Color. WHITE;

private Color segmentColor = Color. LIGHT_GRAY;

private Color pointColor = Color. GREEN;

private Segment segment;

// початкове розташування малюнку

private double lengthSegment;

// напрямок зміщення осі обертання

private double movePoint = -1;

private double shift = 0;

private double speedPoint = 1;

// швидкість зміни положенняв просторі

private int speedRepaint = 30;

// кут на Котрий відбувається зміни положення відрізка

private int grad = 15;

/** Цей метод буде викликаний після завантаження аплета */

public void init() (

// Створюємо об'єктиі встановлюємо початкові значення.

Dimension dim = getSize();

// Створюємо Segment, задаючи довжину

lengthSegment = (double) Math. min(w, h)/3;

segment = new Segment(lengthSegment, lengthSegment / 2, grad,

segmentColor, pointColor, fonColor);

bi = (BufferedImage) createImage(w, h);

big = bi.createGraphics();

big.setRenderingHint(RenderingHints. KEY_ANTIALIASING,

RenderingHints. VALUE_ANTIALIAS_ON);

// Створюємо потік, Котрий буде періодично викликати метод update.

timer = New Thread (this);

) catch (Exception e) (

System. out.println(e);

) // end init

// Цей метод виконує перемальовку вікна аплета

public void update(Graphics g) (

// Отримуємо покажчик на об'єкт Graphics2D

Graphics2D g2 = (Graphics2D) g;

// Малюємо готове зображення на екрані

g2.drawImage(bi, 0, 0, this);

) catch (Exception error) (

System. out.println(error.getMessage());

private void grawSegment() (

* //Очищаємо малюнок big.setBackground(Color.BLUE); big.clearRect(0, 0,

// Малюємо відрізок

shift += movePoint * speedPoint;

if (shift< -lengthSegment / 2) {

movePoint *=-1;

shift = -lengthSegment/2;

) else if (shift > lengthSegment / 2) (

movePoint *=-1;

shift = lengthSegment/2;

segment.setPos(shift, speedPoint);

segment.rotate();

big.drawImage(segment.getSegment(), null, 0, 0);

// Цей метод виконуєтьсяв окремому потоці(Тімер).

// Він викликає перемальовку вікна аплета кожну секунду.

public void run() (

Thread. currentThread();

Thread. sleep(SpeedRepaint);

) catch (Exception err) (

// Цей метод виконується якщо користувач покинув сторінку

// з аплетом. Він зупиняє потік(timer) та, відповідно,

// перемальовку вікнааплету.

public void stop() (

// Цей метод виконується, коли користувач потрапляє на сторінку

/ / З аплетом. Він запускає парралельний потік (timer).

public void start() (

if (timer == null) (

timer = New Thread (this);

// Цей метод виконується при закритті сторінки з аплетом.

public void destroy() (

super.destroy();

Thread. currentThread();

// Чекаємо поки що парралельний потік (timer) завершить роботу.

Thread. yield();

) // end destroy

) // end public class RotatingSegment

// Створення відрізка

private static double x = 0;

final double RAD = 10;

private double length;

private BufferedImage segment;

private Color segmentColor;

private Color pointColor;

private Color backGroundColor;

private Rectangle2D.Double r;

private Ellipse2D.Double p;

private double rotationAxis;

private Point2D.Double center;

private double shift;

// Кут на який відбувається зміни положення відрізка

private int grad;

Segment(double length, double posPointRotating, int grad,

Color segmentColor, Color pointColor, Color backGroundColor)

throws Exception (

// перевіряємо параметри

if (length<= 0 || posPointRotating < 0 || length < posPointRotating)

throw new Exception(

"Помилка: неправильно заданий параметр у класі Segment");

this.grad = grad;

this.segmentColor = segmentColor;

this.pointColor = pointColor;

this.backGroundColor = backGroundColor;

this.length = length;

// створюємо малюнок

segment = new BufferedImage((int) length * 3, (int) length * 3,

BufferedImage. TYPE_INT_ARGB);

центр = новий Point2D.Double(length, 3 * length / 2);

// створюємо відрізок

rotationAxis = center.x + posPointRotating - RAD/2;

p = New Ellipse2D.Double(rotationAxis, center.y, RAD, RAD);

// встановлюємо колір відрізка

g2.setColor(segmentColor);

// Малюємо відрізок

// Встановлюємо колір точки

g2.setColor(pointColor);

// малюємо крапку

// Зміщує точку обертання

public void setPos(double shiftX, double shiftY) (

// створюємо відрізок

this.shift = shiftX;

center.y = center.y + shiftY*Math. sin(Math. toRadians(grad * x));

r = New Rectangle2D.Double(center.x, center.y, length, RAD);

p = New Ellipse2D.Double(rotationAxis + shift, center.y, RAD, RAD);

// обертає відрізок

public void rotate() (

AffineTransform at = AffineTransform. getRotateInstance(

Math. toRadians(grad * (++ x)), rotationAxis + RAD / 2 + shift,

// отримуємо графічний контекст

Graphics2D g2 = segment.createGraphics();

// зафарбовуємо все заданим кольором

g2.setBackground(backGroundColor);

g2.clearRect(0, 0, (int) (3 * length), (int) (3 * length));

g2.setTransform(at);

g2.setColor(segmentColor);

// Малюємо відрізок

// Встановлюємо колір точки

g2.setColor(pointColor);

// малюємо крапку

// Повертає зображення

public BufferedImage getSegment() (

3. ПРИКЛАД РОБОТИ ПРОГРАМИ

Результат виконання програми:

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

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

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

ВИСНОВОК

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

Ми обговорили деякі графічні можливості Java. Ми розпочали з короткого знайомства з фундаментальними основами графіки, такими як системи координат та графічні контексти. Потім ми обговорили засоби Java 2D. Ми також коротко розповіли, як використовувати графічні ефекти.

Друга половина нашого знайомства з графічним програмуванням Java. Використовуючи графічний інтерфейс бібліотек java.awt та javax.swing, ми створили простий графічний редактор, який обертає двовимірний об'єкт навколо своєї осі.

СПИСОК ЛІТЕРАТУРИ

1. Х. М. Дейтел, П. Дж. Дейтел, С.І. Сантрі - Технології програмування на Java, книга 1 (графіка, JAVABEANS, інтерфейс користувача)

2. Джуді Бішоп - Ефективна робота Java

3. James Gosling, Bill Joy, Guy Steele, Gilad Bracha - The Java Language Specification, Second Edition.

4. Tim Lindholm, Frank Yellin - Java Virtual Machine Specification, Second Edition.

5. Гослінг Дж., Арнольд К. - Мова програмування Java

6. Інформація із сайту www.ibm.com

7. Інформація із сайту www.mexmat.sgu.ru

8. Інформація із сайту www.uic.rsu.ru

Розміщено на Allbest.ru

...

Подібні документи

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

    лекція, доданий 01.05.2014

    Розробка графічного редактора для малювання двовимірної та тривимірної графіки, використовуючи мову програмування Java та інтерфейси прикладного програмування Java 2D та Java 3D. Створення графічного редактора 3D Paint. Основні методи класу Graphics.

    курсова робота , доданий 19.11.2009

    Опис пакета прикладної програми NetBeans 8.1. Розробка інтерфейсу аплету. Створення рамкових вікон на базі кадрів бібліотеки java.swing. Зміна кольору текстових даних. Проектування та створення інфологічної моделі аплету.

    контрольна робота , доданий 11.07.2016

    Мережеві можливості мов програмування. Переваги використання Java-аплетів. Класи, що входять до бібліотеки java.awt. Створення інтерфейсу користувача. Сокетне з'єднання із сервером. Графіка у Java. Значення складових кольору.

    курсова робота , доданий 10.11.2014

    Java Foundation Classes, основні концепції. Початкова ієрархія класів Abstract Window Toolkit. Представники інтерфейсу користувача. Обробка подій у JavaBeans. Елементи керування, багаторядкове поле JText. Лістинг програми TextEditor.

    курсова робота , доданий 26.06.2013

    Виконання Java програми. Набір програм та класів JDK. Об'єктно-орієнтоване програмування Java. Принципи побудови графічного інтерфейсу. Компонент та контейнер графічної системи. Аплети як програми, що працюють у середовищі браузера.

    курсова робота , доданий 08.02.2011

    Діаграма консольного застосування табулювання функції. Відмінність консольної програми та програми та GUI. Діаграма класів для JFrame і JPanel. Створення найпростішого кадру в Java. Компонування елементів інтерфейсу всередині кадру. Цикл обробки подій.

    лекція, доданий 01.05.2014

    Поняття та загальна характеристика мови програмування РНР, принципи та етапи його роботи, синтаксис та асоційовані масиви. Обробка винятків у мові Java. Робота з базами даних за допомогою JDBC. Вивчення порядку розробки графічного інтерфейсу.

    презентація , доданий 13.06.2014

    Розробка логічної схеми бази даних автомобілебудівного підприємства. Інфологічне моделювання системи. Створення графічного інтерфейсу користувача бази даних засобами мови програмування Java. Тестування програмних засобів.

    курсова робота , доданий 16.12.2013

    Створення консольних програм з використанням графічного інтерфейсу користувача. Зміст панелі компонентів програми С++ Builder. Використання можливостей об'єктно-орієнтованого програмування, особливості редактора коду та форм у С++.



Завантаження...
Top