Created
December 16, 2018 19:07
-
-
Save PolarNick239/6d59cd940e43c04ba06427d933596b07 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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: нарисуйте змейку из шариков (чтобы шарик преследовал шарик поменьше, за ним шарик еще поменьше и так далее) | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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