Рисование фигур в окне JFrame
Есть окно JFrame, и 2 переменные: х и у.
Задача: 10 раз в секунду отрисовывать черный квадратик по координатам х и у.
Как это можно сделать?
Ответы (1 шт):
Как вообще нарисовать квадрат?
- Создайте какой-нибудь класс, который будет наследоваться от
javax.swing.JPanel. В нём переопределите методpaintComponent(Graphics g):
import javax.swing.JPanel;
import java.awt.Graphics;
public class GraphicsPanel extends JPanel {
@Override
public void paintComponent(Graphics g){
}
}
- В переопределённом методе нарисуйте фигуры. Прямоугольники и квадраты можно рисовать с помощью метода
fillRect(). Этот метод принимает на вход четыре параметра:int x,int y,int width,int height.
Из документации:
x - the x coordinate of the rectangle to be filled.
y - the y coordinate of the rectangle to be filled.
width - the width of the rectangle to be filled.
height - the height of the rectangle to be filled.
Вольный перевод:
x - координата по оси x левого верхнего угла прямоугольника
y - координата по оси y левого верхнего угла прямоугольника
width - ширина прямоугольника
heigth - высота прямоугольника
Чтобы нарисовать квадрат, укажите одинаковую высоту и ширину. Это будет выглядеть как-то так:
g.fillRect(50, 50, 20, 20);
При таком вызове метода будет нарисован квадрат, левый верхний угол которого находится по координате 50, 50 и имеет высоту 20 пикселей и такую же ширину.
- Теперь самое важное - нужно "привязать" нарисованное к окну
Сделать это проще всего, используя полиморфизм:
JFrame frame = new JFrame("Это квадрат");
JPanel panel = new GraphicsPanel(); //Используем полиморфизм
frame.setContentPane(panel);
Важно: не забудьте отобразить фрейм и задать ему размер =).
Как его рисовать раз в десять секунд?
- Создайте в классе с переопределённым методом
paintComponent()поле типаboolean. Я назову егоhideи сделаю его статическим:
public static boolean hide;
- В методе
painComponent()пропишите, что рисовать квадрат нужно только если значение поляhideравноfalse:
if(hide == false){
g.fillRect(50, 50, 20, 20);
}
- С помощью класса
java.util.Timerменяйте значение переменнойhideраз в какое-то время. Проще всего для этого использовать анонимный класс:
Timer timer = new Timer();
timer.schedule(new TimerTask(){
@Override
public void run(){
if(GraphicsPanel.hide == true){
hide = false;
} else {
hide = true;
}
frame.repaint();
}
}, 0, 10000); //Второй параметр - это время, через которое будет каждый раз срабатывать таймер.
Важно: не забудьте импортировать классы java.util.Timer и java.util.TimerTask!
P.S
если вам нужно нарисовать незакрашенный прямоугольник, то используйте метод drawRect(). Вызывать его нужно точно так же.