2013-10-07 2 views
3

В настоящее время я изучаю Java, и я пытаюсь создать программу экранной заставки. Самое важное правило - не использовать какие-либо петли. другим ключевым критерием является использование «x» для выхода из программы и «z» для перехода с полноэкранного режима на полуэкран. Моя первая наклонность заключалась в том, чтобы использовать setDefaultCloseOperation вместе с keylistener для выхода из программы, но я не нашел способа сделать это. кто-нибудь может помочь мне понять, как это сделать, не используя цикл.Выход из программы с помощью keylistener без цикла

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class ScreenSaver1 extends JPanel { 
    private JFrame frame = new JFrame("FullSize"); 
    private Rectangle rectangle; 
    boolean full; 

    ScreenSaver1() { 
     // Remove the title bar, min, max, close stuff 
     frame.setUndecorated(true); 
     // Add a Key Listener to the frame 
     frame.addKeyListener(new KeyHandler()); 
     // Add this panel object to the frame 
     frame.add(this); 
     // Get the dimensions of the screen 
     rectangle = GraphicsEnvironment.getLocalGraphicsEnvironment() 
     .getDefaultScreenDevice().getDefaultConfiguration().getBounds(); 
     // Set the size of the frame to the size of the screen 
     frame.setSize(rectangle.width, rectangle.height); 
     frame.setVisible(true); 
     // Remember that we are currently at full size 
     full = true; 
    } 
    // This method will run when any key is pressed in the window 
class KeyHandler extends KeyAdapter { 
    public void keyPressed(KeyEvent e) { 
     // Terminate the program. 
     System.exit(0); 
    } 

} 

public static void main(String[] args) { 
     ScreenSaver1 obj = new ScreenSaver1(); 
    } 
} 
  1. Вы не можете использовать циклы любого рода в этой программе.
  2. Ваши переменные-члены должны быть частными.
  3. Ваш класс экранной заставки должен наследовать от класса JPanel и должен иметь переменную-член JFrame.
  4. Ваша программа должна отслеживать количество фигур, которые она рисует на экране, и после того, как было нарисовано 30 фигур, она должна очистить экран. Это проще всего сделать, вызвав метод paintComponent базового класса (JPanel).
  5. Вы должны использовать объект Timer для генерации ActionEvents для управления экранной заставкой. Установите таймер для запуска ActionEvent каждые 500 миллисекунд. Это вызовет ваш actionPerformed метод, который должен просто вызвать метод repaint. Вызов метода repaint вызывает выполнение метода paintComponent.
  6. Ваш метод paintComponent будет выполнять всю работу, чтобы выбрать случайный цвет, случайную форму и случайное положение в пределах вашей панели, и нарисуйте эту фигуру, сохранив подсчет количества фигур, которые были нарисованы.
  7. Создайте частный метод, который возвращает случайный цвет, когда он называется, который может быть любым возможным случайным значением цвета. Этот метод будет вызываться из вашего метода paintComponent и из обработчика событий KeyListener, как описано ниже.
  8. Ваш метод paintComponent должен использовать по крайней мере четыре разные формы, которые вы произвольно выбираете из ... овальных, прямоугольных, заполненных овалов, заполненных прямоугольников, полигонов, линий и т. Д.
  9. Размер и положение фигур, которые вы рисуете, должны меняться в зависимости от размера экрана. По крайней мере, часть каждой фигуры должна быть видна на экране.
  10. Сделайте свой экранный экран полным размером экрана.
  11. Добавьте ключевое устройство в рамку. KeyListener должен обрабатывать события KeyPressed.
  12. Ваш KeyListener должен вызвать System.exit при нажатии клавиши «x».
  13. Когда клавиша «z» нажата, ваш KeyListener должен изменить размер окна с полноэкранного размера до половины размера (половина ширины и высоты экрана) или от половины размера до полного размера. То есть, каждый раз, когда нажата клавиша «z», размер дисплея переключается между полным и половинным размером. Это требует изменения размера рамки и вызова перерисовки. СОВЕТ. Помните, что для того, чтобы получить фоновый рисунок, вам нужно будет установить счетчик на 0.
  14. Когда нажата клавиша «r», ваш KeyListener должен изменить цвет фона дисплея на Случайный цвет. Это означает, что он должен получить новый случайный цвет и вызвать setBackground панели с новым случайным цветом. Затем он должен вызвать перерисовку. СОВЕТ. Помните, что для того, чтобы получить фон для перерисовывания, вам нужно будет установить счетчик на 0.
+1

Какой бред ... Дать заставку без петель ... –

+1

сообщение, что вы пробовали. –

+3

@MartijnCourteaux: Мне было бы интересно, как инструктор решает проблему, не полагаясь на цикл событий ОС. –

ответ

2

Ваш ключ Обработчик должен реализовать Keypressed так:

  public void keyPressed(KeyEvent e) 
      {     
       if (e.getKeyChar() == 'x') { 
        System.out.println("Exiting"); 
        System.exit(0); 
       } 
       else if (e.getKeyChar() == 'z') { 
        System.out.println("Resizing"); 
       } 
      } 
+0

Так я и думал об этом, но это цикл, и мне не разрешено использовать ЛЮБЫЕ циклы для этого назначения. – Ryel

+0

Здесь нет петли. Если операторы/else являются ветвящимися операциями, а не циклическими. Я думаю, что ограничение цикла состоит только в том, чтобы использовать таймер вместо использования цикла и thread.sleep() для реализации процесса обновления экранной заставки. –

+0

WoW. Я ударяю головой о стену, думая, что если-иначе была петля (путающая ее с петлями). Так что определенно работает, и я пошел вперед и добавил. frame.setSize ((int) rectangle.getWidth()/2, (int) rectangle.getHeight()); для изменения размера до половины экрана. – Ryel

2

Я бы прочитал проблему/назначение как полагаться на стандартный цикл событий AWT .. и не кодировать никаких дополнительных циклов. Так что это вопрос событий, обработчики & повторного запуска.(Pseudo-loops - переключатель внутри рекурсивного fn - не будет хорошо воспроизводиться с потоком отправки событий AWT, поэтому я думаю, что мы сможем разрешить этот подход).

Вот некоторые возможные средства:

подход «Таймер» позволит вам возобновить выполнение, запланировав событие таймера/или события, на более поздней интервал.

Подход «EventQueue» позволит вам немедленно опубликовать событие, чтобы возобновить выполнение.

Оба подхода позволят избежать необходимости использования явных циклов в вашем коде, вместо этого позволяя ему многократно вызывать существующий цикл диспетчеризации событий.

+1

Да. Я планирую использовать таймер для этого назначения в какой-то момент, но мой план является поэтапным методом. Сначала я хочу, чтобы keylistener выпрямился, чтобы я мог взять то, что у меня есть, и использовать «x» для выхода, а «z» - изменять размер до половины экрана. Затем я планирую настройку фигур, а затем реализацию таймера, чтобы помочь генерировать случайные фигуры. – Ryel

Смежные вопросы