Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import static javax.swing.WindowConstants.EXIT_ON_CLOSE;
public class Main {
public static void main(String[] args) throws InterruptedException {
// Создаем окно
JFrame frame = new JFrame();
// Создаем нашу основную панель, в которой будет нарисовано что-то красивое
MyPanel panel = new MyPanel();
// Создаем две кнопки: кнопка паузы и кнопка выводящая в консоль сообщение
JButton pauseButton = new JButton("pause");
JButton helloWorldButton = new JButton("hello world!");
// Навешиваем обработчики событий на обе кнопки - одна кнопка должна ставить на паузу рисующуюся красоту
pauseButton.addActionListener(new MyPauseListener(panel));
// Вторая кнопка должна выводить сообщение в консоль
helloWorldButton.addActionListener(new ActionListener() {
// Таким образом можно реализовать интерфейс ActionListener прямо посреди кода, без необходимости создавать
// новый класс MyYetAnotherActionListener.
// Иногда это хорошая идея, например когда в методе делается что-то очень простое и короткое, как здесь.
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Hello world!");
}
});
// Создаем панель, в которой будут лежать две кнопки
JPanel controls = new JPanel();
// Настраиваем layout этой панели - нам подойдет табличка из двух строчек и одного столбца
controls.setLayout(new GridLayout(2, 1));
// Добавляем кнопки
controls.add(pauseButton);
controls.add(helloWorldButton);
// Настраиваем layout всего окна
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER); // по центру будет панель рисующая красоту
frame.add(controls, BorderLayout.EAST); // справа будет панель с управлением
frame.setSize(640, 480);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
while (true) {
panel.repaint();
Thread.sleep(10);
}
// TODO 0: разберитесь во всем коде. Находите ответы на вопросы и выполняйте задания изложенные ниже:
// Какие компоненты содержатся в окне?
// Какие компоненты содержатся в свою очередь в этих компонентах?
// Нарисуйте на бумажке иерархию из объектов (какой компонент в ком лежит). Всего объектов 5: окно, панель с шариком, панель с кнопками, кнопка паузы, кнопка hellow world.
// Какой компонент занимается отрисовкой шарика?
// Где в коде реализована отрисовка шарика?
// TODO 1: сделайте так, чтобы шарик двигался против часовой стрелки
// Почему шарик меняет свой размер в зависимости от размера окна? Какой код за это ответственен?
// TODO 2: сделайте так, чтобы шарик никогда не выходил за пределы панели, при этом подходя к ее границе касался ее как раз своим краешком, и чтобы его движение было строго симметрично относительно центра панели (сейчас шарик немного смещен)
// Зачем в MyPauseListener есть поле panel?
// TODO 3: сделайте так, чтобы объект двигался только когда this.paused == false, и стоял на месте когда this.paused == true
// Почему если поставить на паузу, а через некоторое время паузу отпустить - то шарик телепортируется, а не продолжает свое движение дальше?
// TODO 4: сделайте так, чтобы при снятии с паузы шарик продолжал движение, а не телепортировался
// TODO 5: сделайте так, чтобы на кнопке паузы было сообщение "pause" (когда шарик летает) и "run" (когда движение на паузе)
// TODO 6: добавьте к кнопкам JLabel, в котором будет сообщение "paused" (когда движение на паузе) и "running" (когда шарик летает)
// TODO 7: добавьте две кнопки Speed+ и Speed-, которые будут увеличивать и уменьшать скорость движения соответственно
// TODO 8: нарисуйте змейку из шариков (чтобы шарик преследовал шарик поменьше, за ним шарик еще поменьше и так далее)
}
}
import javax.swing.*;
import java.awt.*;
public class MyPanel extends JPanel {
double speed;
double alpha;
long prevTime;
boolean paused;
public MyPanel() {
this.speed = 0.01;
this.alpha = 0.0;
this.prevTime = System.currentTimeMillis();
this.paused = false;
}
public boolean isPaused() {
return paused;
}
public void setPaused(boolean paused) {
this.paused = paused;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int objectRadius = Math.min(this.getWidth() / 10, this.getHeight() / 10);
int orbitRadius = Math.min(this.getWidth() / 2, this.getHeight() / 2) - objectRadius;
int centerX = this.getWidth() / 2;
int centerY = this.getHeight() / 2;
int objectX = (int) (centerX + orbitRadius * Math.cos(this.alpha));
int objectY = (int) (centerY + orbitRadius * Math.sin(this.alpha));
g.drawOval(objectX, objectY, 2 * objectRadius, 2 * objectRadius);
long curTime = System.currentTimeMillis();
long dt = curTime - this.prevTime;
this.alpha += dt * this.speed;
this.prevTime = curTime;
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyPauseListener implements ActionListener {
MyPanel panel;
public MyPauseListener(MyPanel panel) {
this.panel = panel;
}
@Override
public void actionPerformed(ActionEvent e) {
if (!panel.isPaused()) {
System.out.println("Paused!");
panel.setPaused(true);
} else {
System.out.println("Unpaused!");
panel.setPaused(false);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment