Интерфейс - LarsVealomre/Interface GitHub Wiki

Графические библиотеки в языке программирования Java.

  1. AWT.

Плюс Java AWT – работает данный Фреймворк очень быстро.

Минус Java AWT – общих контроллеров в общем окружении данного Фреймворка мало, следовательно на разных OC итоговый интерфейс данного Фреймворка будет выглядеть по-разному.

  1. Swing.

Плюсы Java Swing:

  1. GUI полностью портабельный.

  2. Java Swing позволяет менять стили приложения.

  3. Данный Фреймворк актуален в наше время.

Минус Java Swing – он использует формочки, которые генерируют AWT, и непосредственно на них уже сам рисует контроллы. Из этого следует медленная работа GUI.

  1. SWT (Standard Widget Toolkit).

Плюс SWT – намного эффективнее Swing и AWT.

Минус SWT – зависимость от OC и оборудования.

  1. 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) {

}

}

Далее попробуем нарисовать картинку. Для этого нам понадобится:

  1. public void paint (Graphics2D)g:

public void paint(Graphics g) { Graphics2D grph = (Graphics2D)g;

}

  1. Загрузить картинку в проект:

Image wall = new ImageIcon ("src/wall.jpg").getImage();

Где (“src/wall.jpg”) – путь к изображению

  1. Теперь непосредственно нарисуем его:

public void paint(Graphics g) { Graphics2D grph = (Graphics2D)g; grph.drawImage(wall, 0, 0, null);

}

При запуске программы, откроется окно с нашей картинкой.

Теперь добавим объект, который будет ездить по стенке. для этого:

  1. Выставим его координаты:

private int Rx = 0, Ry = 0, W = 50, H = 50; Rectangle rectangle = new Rectangle(Rx, Ry, W, H)

  1. Выведем его на экран:

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) {

}

}

А наша программа при запуске покажет нашу картинку стены + квадрат, который мы нарисовали (исходя из прописанных координат – в углу).

Теперь попробуем добавить движение нашего квадрата вправо, и вниз. Для этого мы проделаем следующее:

  1. Добавим таймер:

Timer t = new Timer (7, this);

  1. Таймер мы запускаем после того, как все отрисуется:

public void paint(Graphics g) { Graphics2D grph = (Graphics2D)g; grph.drawImage(wall, 0, 0, null); grph.fill(rectangle); t.start();

}

  1. Теперь мы в actionPerformed пропишем repaint. Для того чтобы наша программа делала нам перерисовку:

public void actionPerformed(ActionEvent e) { repaint(); }

  1. Далее добавим движение вправо. Для этого пропишем в keyPressed следующее:

    public void keyPressed(KeyEvent e) { if (e.getKeyCode()==KeyEvent.VK_RIGHT) { rectangle.setLocation(rectangle.x+15, rectangle.y); Rx+=1; } }

    Где Rx+=1 означает, что наш квадрат будет проходить единицу за каждый шаг.

  2. Теперь пропишем движение вниз. Для этого допишем ниже еще одну команду, но за место 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; } }

  3. Допишем движение вверх и влево соответственно:

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) {

}

}

При запуске программы, пользователь сможет направлять созданный нами квадрат в любую из сторон. При нажатии на заданные нами выше клавиши, квадрат будет двигаться в соответственном направлении.