Интерфейс - LarsVealomre/Interface GitHub Wiki
Графические библиотеки в языке программирования Java.
- AWT.
Плюс Java AWT – работает данный Фреймворк очень быстро.
Минус Java AWT – общих контроллеров в общем окружении данного Фреймворка мало, следовательно на разных OC итоговый интерфейс данного Фреймворка будет выглядеть по-разному.
- Swing.
Плюсы Java Swing:
-
GUI полностью портабельный.
-
Java Swing позволяет менять стили приложения.
-
Данный Фреймворк актуален в наше время.
Минус Java Swing – он использует формочки, которые генерируют AWT, и непосредственно на них уже сам рисует контроллы. Из этого следует медленная работа GUI.
- SWT (Standard Widget Toolkit).
Плюс SWT – намного эффективнее Swing и AWT.
Минус SWT – зависимость от OC и оборудования.
- Java FX.
Java FX разрабатывалась в компании Oracle для замены Swing.
Java FX на порядок удобнее библиотеки Swing, следовательно, пользоваться ей тоже намного удобнее.
Отличия Java FX от Swing:
Swing Java FX
Верстка Java Code FXML Стили Java Code CSS Логика Java Code Java Code
Также, в Java FX добавили большое количество других контроллов (различные графики, работа с 3д графикой и так далее).
Java FX предоставляет все, что нужно для написания современной программы.
Работа с изображениями imagelcon на языке программирования Java.
В данной практике, я попробую написать программу, которая будет представлять из себя интерфейс примитивного фоторедактора. То есть, при запуске программы будет открываться окно, в котором будет изображение с бегающим курсором в виде квадрата.
Для начала создадим проект в рабочей среде программирования на языке Java – IntelliJ IDEA.
Далее, подготовим заранее изображение. Для примера, я выбрал изображение стены.
Далее, закинем наше изображение в папку проекта src. Редактор предложит нам изменить директорию, соглашаемся, нажимаем ok.
Это так-же можно было сделать через импорт файлов в самой среде.
Далее подключаем все java компоненты, и методы, а также KeyListener и ActionListener:
package com.company;
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;
public class Main extends JComponent implements KeyListener, ActionListener {
public static void main(String[] args) {
}
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
Начнём в frame:
public static void main(String[] args) { Main t = new Main(); JFrame f = new JFrame( "test");
}
Далее установим размер:
f.setSize(1028,720);
И чтобы не закрывать программу вручную, пропишем:
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Далее добавим KeyListener:
f.addKeyListener(t);
Далее добавим сам класс, объект, и установим ему видимость:
f.add(new Main ()); f.add(t); f.setVisible(true);
Наш код на данном этапе будет иметь вид:
package com.company;
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;
public class Main extends JComponent implements KeyListener, ActionListener {
public static void main(String[] args) {
Main t = new Main();
JFrame f = new JFrame( "test");
f.setSize(1028,720);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.addKeyListener(t);
f.add(new Main ());
f.add(t);
f.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
Далее попробуем нарисовать картинку. Для этого нам понадобится:
- public void paint (Graphics2D)g:
public void paint(Graphics g) { Graphics2D grph = (Graphics2D)g;
}
- Загрузить картинку в проект:
Image wall = new ImageIcon ("src/wall.jpg").getImage();
Где (“src/wall.jpg”) – путь к изображению
- Теперь непосредственно нарисуем его:
public void paint(Graphics g) { Graphics2D grph = (Graphics2D)g; grph.drawImage(wall, 0, 0, null);
}
При запуске программы, откроется окно с нашей картинкой.
Теперь добавим объект, который будет ездить по стенке. для этого:
- Выставим его координаты:
private int Rx = 0, Ry = 0, W = 50, H = 50; Rectangle rectangle = new Rectangle(Rx, Ry, W, H)
- Выведем его на экран:
grph.fill(rectangle);
Исходный код на данном этапе будет иметь ввид:
package com.company;
import javax.swing.; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;
public class Main extends JComponent implements KeyListener, ActionListener { Image wall = new ImageIcon ("src/wall.jpg").getImage(); private int Rx = 0, Ry = 0, W = 50, H = 50; Rectangle rectangle = new Rectangle(Rx, Ry, W, H);
public void paint(Graphics g) { Graphics2D grph = (Graphics2D)g; grph.drawImage(wall, 0, 0, null); grph.fill(rectangle);
}
public static void main(String[] args) {
Main t = new Main();
JFrame f = new JFrame( "test");
f.setSize(1028,720);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.addKeyListener(t);
f.add(new Main ());
f.add(t);
f.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
А наша программа при запуске покажет нашу картинку стены + квадрат, который мы нарисовали (исходя из прописанных координат – в углу).
Теперь попробуем добавить движение нашего квадрата вправо, и вниз. Для этого мы проделаем следующее:
- Добавим таймер:
Timer t = new Timer (7, this);
- Таймер мы запускаем после того, как все отрисуется:
public void paint(Graphics g) { Graphics2D grph = (Graphics2D)g; grph.drawImage(wall, 0, 0, null); grph.fill(rectangle); t.start();
}
- Теперь мы в actionPerformed пропишем repaint. Для того чтобы наша программа делала нам перерисовку:
public void actionPerformed(ActionEvent e) { repaint(); }
-
Далее добавим движение вправо. Для этого пропишем в keyPressed следующее:
public void keyPressed(KeyEvent e) { if (e.getKeyCode()==KeyEvent.VK_RIGHT) { rectangle.setLocation(rectangle.x+15, rectangle.y); Rx+=1; } }
Где Rx+=1 означает, что наш квадрат будет проходить единицу за каждый шаг.
-
Теперь пропишем движение вниз. Для этого допишем ниже еще одну команду, но за место x, у нас квадрат будет двигаться по y:
public void keyPressed(KeyEvent e) { if (e.getKeyCode()==KeyEvent.VK_RIGHT) { rectangle.setLocation(rectangle.x+15, rectangle.y); Rx+=1; } if (e.getKeyCode()==KeyEvent.VK_DOWN) { rectangle.setLocation(rectangle.x, rectangle.y+15); Ry+=1; } }
-
Допишем движение вверх и влево соответственно:
public void keyPressed(KeyEvent e) { if (e.getKeyCode()==KeyEvent.VK_RIGHT) { rectangle.setLocation(rectangle.x+15, rectangle.y); Rx+=1; } if (e.getKeyCode()==KeyEvent.VK_DOWN) { rectangle.setLocation(rectangle.x, rectangle.y+15); Ry+=1; } if (e.getKeyCode()==KeyEvent.VK_LEFT) { rectangle.setLocation(rectangle.x-15, rectangle.y); Ry+=1; } if (e.getKeyCode()==KeyEvent.VK_UP) { rectangle.setLocation(rectangle.x, rectangle.y-15); Ry+=1; } }
Исходный код будет иметь ввид:
package com.company;
import javax.swing.; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;
public class Main extends JComponent implements KeyListener, ActionListener { Image wall = new ImageIcon ("src/wall.jpg").getImage(); private int Rx = 0, Ry = 0, W = 50, H = 50; Timer t = new Timer (7, this); Rectangle rectangle = new Rectangle(Rx, Ry, W, H);
public void paint(Graphics g) { Graphics2D grph = (Graphics2D)g; grph.drawImage(wall, 0, 0, null); grph.fill(rectangle); t.start();
}
public static void main(String[] args) {
Main t = new Main();
JFrame f = new JFrame( "test");
f.setSize(1028,720);
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.addKeyListener(t);
f.add(new Main ());
f.add(t);
f.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode()==KeyEvent.VK_RIGHT) { rectangle.setLocation(rectangle.x+15, rectangle.y); Rx+=1; } if (e.getKeyCode()==KeyEvent.VK_DOWN) { rectangle.setLocation(rectangle.x, rectangle.y+15); Ry+=1; } if (e.getKeyCode()==KeyEvent.VK_LEFT) { rectangle.setLocation(rectangle.x-15, rectangle.y); Ry+=1; } if (e.getKeyCode()==KeyEvent.VK_UP) { rectangle.setLocation(rectangle.x, rectangle.y-15); Ry+=1; } }
@Override
public void keyReleased(KeyEvent e) {
}
}
При запуске программы, пользователь сможет направлять созданный нами квадрат в любую из сторон. При нажатии на заданные нами выше клавиши, квадрат будет двигаться в соответственном направлении.