неділя, 28 липня 2013 р.

Action Listener

В нас зараз є 5 кнопок, але вони не виконують ніякої дії. В Java компоненти мають спеціальний алгоритм зворотнього зв’язку і він виконується за допомогою інтерфейсу ActionListener. У цьому інтефейсі оголошено 1 метод:

public void actionPerformed(ActionEvent e)

А у всіх компонентів, які мають зворотній зв’язок, є метод
     AddActionListener(ActionListener)
Він приймає клас, що реалізує інтерфейс ActionListener, і дописує його у свій масив слухачів. Якщо відбувається, якась дія, що потребує виклику цих слухачів, то компонент перебирає свій масив та викликає у кожному елементі метод actionPerformed з передачою параметра про подію (ActionEvent). Цей параметр містить інформацію про того хто відправника та інше, зараз це не важливо.
Нам необхідно створити цього слухача та додати до кнопки. Я думаю, що краще буде створити свого  слухача для кожної кнопки, хоча можна б було обійтися одним та перевіряти параметри події, але цей варіант не подобається, якщо хтось хоче, то можете написати мені у коментарях і я розповім як це робити.
Отже, створюємо новий клас у пакеті run який назвемо ActionListenerQuickGame та вказуємо інтерфейс ActionListener.




 
IDE автоматично створе клас, який реалізує цей інтерфейс, нам тільки залишеться переписати метод actionPerformed. Зараз він нічого особливого робити не буде, просто виведе інформаційне вікно, що натиснули кнопку QuicGame:

public void actionPerformed(ActionEvent arg0) {
            JOptionPane.showMessageDialog(null, "Press QuickGame button");
      }
Ви помітили клас JOptionPane. Цей клас імплементує різні діалоги, ми будемо ними  користуватися і я по жоду діла було про нього розповідати. А зараз нам потрібен його статичний метод showMessageDialog, в нього є декілька перегрузок, ми використовуємо найпростішу, що приймає 1 параметром батьківський елемент (у цьому випадку ми вказуємо, що його немає) та стрічку, яка буде показана у тілі діалогу. Не забувайте натискати Ctrl-Shift-O для автоімпорту пакетів J. Клас у нас є і залишилося підключити його до кнопки. У класі Main знаходимо стрічку з ініціалізацією кнопки та після неї пишемо наступний код:

quickGame.addActionListener(new ActionListenerQuickGame());

Він додає до масиву дій кнопки створений нами слухач. Тепер запускаємо та  натискаємо кнопку QuickGame. Ви повинні побачити наступне:
Створіть ще 4 слухача для інший кнопок.


Слухач для кнопки виходу потрібно зробити вже готовим. Тому напишіть у ньому такий код:
      System.exit(0);

Цей метод завершує програму з кодом 0. Цей код означає, що програма завершилась коректно.

Архів з вихідним кодом можна завантажити тут.

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

Якщо виникають запитання, будь ласка пишіть їх в коментарях, я обов'язково відповім :-)

неділя, 14 липня 2013 р.

Man Versus Blocks - Begin (частина 2)

Отже, ви завантажили  Eclipse та запустили його. Перше, що необхідно зробити це створити новий проект під назвою «Man Versus Blocks». Для цього натисніть на FileNewJava project.  Після цього введіть назву проекту та натисніть Finish. Там також можна додатково налаштувати проект, але зараз це не потрібно.
Давайте створимо перший клас, який буде головним. Оскільки, він буде запускатися першим, то давайте він буде знаходитися в пакеті run”. Значить натискаємо правою кнопкою по проекту та вибираємо  NewPackage і вводимо назву run”. Після цього IDE створе нову папку у файловій системі і у менеджері проекту її буде видно. Тепер клацаємо по цій попці і вибираємо NewClass. Вводимо назву Main  та ставимо галочку навпроти public static void main(String[] args). Це згенерує нам необхідний код для запуску програми. У класі пишемо цей код:
package run;

import javax.swing.JFrame;

public class Main {
     
      public static void main(String[] args)
      {
            JFrame jf = new JFrame("Man versus blocks");
            jf.setSize(700, 700);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setVisible(true);
      }
     
}

Перша стрічка коду вказує на пакет у якому знаходиться клас, у нашому випадку це run. Друга стрічка імпортує клас JFrame, який знаходиться у пакеті javax.swing . У Java є дві бібліотеки для виведення графічних елементів управління це AWT та Swing, ми будемо використовувати другу, тому що вона є новішою та біль красива і ще платформо-незалежна. Далі ми оголошуємо клас Main. Ключове слово class вказує, що це клас, public вказує на те, що він доступний у інших пакетах, якщо ми це не вкажемо, то цей клас буде доступний тільки у пакеті в якому він оголошений. Далі ми відкриваємо блок класу і описуємо метод main. Цей метод є вхідною точкою програми, тобто програма розпочинає свою роботу саме з нього. Він обов’язково має бути публічним та статичним. У методі public означає, що метод доступний за класом, а static означає, що для виклику цього методу не потрібно створювати екземпляр класу (це ще називають «метод типу», тому що кожний клас це тип). Ми передаємо один аргумент у цей клас, це масив стрічок. Його заповнює операційна система, коли ми запускаємо програму з консолі та вказуємо параметри після назви. Далі ми оголошуємо зміну типу JFrame. Цей клас імплементує (реалізує) фрейм, у операційних системах для PC це звичайне вікно. У конструкторі цього класу ми передаємо стрічку, яка слугує назвою фрейму. Далі вказуємо розміри вікна (700х700), та операцію, яка буде виконуватися при закриті фрейму, тобто вихід із програми. І в кінці встановлюємо фрейм видимим. Отже, можна запусти програму натиснувши клавішу F11. Ви повинні побачити вікно з заданим розміром та назвою.
Взагалі всі назви класів Swing розпочинаються із “J”, а відповідні класи з AWT без цієї букви.
Тепер давайте приготуємо цей клас до вигляду який нам потрібно. Для початку потрібно винести зміну jf із методу до класу, щоб ми в майбутньому могли оперувати вікном.
private static JFrame jf = null;
Це потрібно написати перед методом main. Зверніть увагу на static, це необхідно тому що статичні методи можуть оперувати тільки статичними полями.
У методі main замініть стрічку
JFrame jf = new JFrame("Man versus blocks");
на
Main.jf = new JFrame("Man versus blocks");

Main перед jf можна не вказувати, але так краще, тому що каже нам, що це поле класу

Також щоб ми могли додавати багато елементів до вікна потрібно створити панель, її вставити у вікно, а вже у панель будемо вставляти все що необхідно. Тому після оголошення jf пишемо:

private static Panel panel = new Panel(new GridLayout(1,1));

Також натисніть комбінацію клавіш Ctrl+Shift+O, це додає імпортує необхідні класи, пакети та вилучає непотрібні. У нашому випадку.
Ця стрічка створює панель з розташуванням елементів у таблиці, яка складається з однієї комірки (1х1).
Також необхідно створити панель для меню, тому що воно завжди буде однаковим
private static Panel menu = null;
І ще створимо методи доступу до цих полів:
public static JFrame getFrame(){
      return Main.jf;
}
     
public static Panel getPanel(){
      return Main.panel;
}
     
public static Panel getMenu(){           
return Main.menu;
}
І ще зробимо метод для повернення до головного меню:
public static void ExitToMainMenu(){
      Main.panel.removeAll();
      Main.panel.add(Main.menu);
}

Тепер необхідно вставити 5 кнопки у наш фрейм. Для цього треба дописати у метод main наступний код (потрібно вставити після ініціалізації jf та перед jf.setSize(700, 700); ):

Main.menu = new Panel();
      Main.panel.add(Main.menu);

      Main.menu.setLayout(new BoxLayout(Main.menu, BoxLayout.Y_AXIS)); 
     
      Button quickGame = new Button();
      quickGame.setLabel("Quick Game");
      Main.menu.add(quickGame);
           
      Button loadArena = new Button();
      loadArena.setLabel("Load Arena");
      Main.menu.add(loadArena);
           
      Button replay = new Button();
      replay.setLabel("Replay");
      Main.menu.add(replay);
           
      Button editor = new Button();
      editor.setLabel("Editor");
      Main.menu.add(editor);
           
      Button exit = new Button();
      exit.setLabel("Exit");
Main.menu.add(exit);
           
jf.add(Main.panel);

Для початку ми ініциалізуємо  menu та додаємо його до головної панелі. Меню вказуємо, яку компоновку будемо використовувати BoxLayout. Ця компоновка додає елементи підряд, стандартно вона додає по горизонталі, але наші кнопки повинні бути вертикально, тому вказуємо вертикальне заповнення BoxLayout.Y_AXIS. Далі Створюємо 5 кнопок з відповідним текстом у них і додаємо до меню. Метод класа Buttin setLabel(String) вказує текст кнопки.
Після цього додаємо головну панель до вікна. При запуску ви повинні побачити таке вікно:
 


Ось повний текст класу:

package run;

import java.awt.Button;
import java.awt.GridLayout;
import java.awt.Panel;

import javax.swing.BoxLayout;
import javax.swing.JFrame;

public class Main {
     
      private static JFrame jf = null;
      private static Panel panel = new Panel(new GridLayout(1, 1));
      private static Panel menu = null;
     
      public static void main(String[] args)
      {
            Main.jf = new JFrame("Man versus blocks");
           
            Main.menu = new Panel();
            Main.panel.add(Main.menu);

            Main.menu.setLayout(new BoxLayout(Main.menu, BoxLayout.Y_AXIS));
           
            Button quickGame = new Button();
            quickGame.setLabel("Quick Game");
            Main.menu.add(quickGame);
           
            Button loadArena = new Button();
            loadArena.setLabel("Load Arena");
            Main.menu.add(loadArena);
           
            Button replay = new Button();
            replay.setLabel("Replay");
            Main.menu.add(replay);
           
            Button editor = new Button();
            editor.setLabel("Editor");
            Main.menu.add(editor);
           
            Button exit = new Button();
            exit.setLabel("Exit");
            Main.menu.add(exit);
           
            jf.add(Main.panel);
           
            jf.setSize(700, 700);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setVisible(true);
      }
     
      public static JFrame getFrame(){
            return Main.jf;
      }
     
      public static Panel getPanel(){
            return Main.panel;
      }
     
      public static Panel getMenu(){
            return Main.menu;
      }
     
      public static void ExitToMainMenu(){
            Main.panel.removeAll();
            Main.panel.add(Main.menu);
      }
     
}


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

Тут використовується шаблон проектування Компонувальник. Його суть у тому, що є загальний інтерфейс або клас який називається компонент, від якого наслідуються інші класи, і деякі з цих класів можуть містити у собі другі компоненти. І так можна будувати дерева об’єктів. Більш детальна інформація за посиланням http://uk.wikipedia.org/wiki/Компонувальник_(шаблон_проектування)