使用keylistener退出程序而没有循环

时间:2013-10-07 21:52:56

标签: java

我正在学习Java,我正在尝试创建一个屏幕保护程序。最重要的规则是不使用任何循环。另一个关键标准是使用'x'退出程序,'z'从全屏变为半屏。我的第一个倾向是使用setDefaultCloseOperation和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个形状后,它必须清除屏幕。这通过调用基类(JPanel的)paintComponent方法最容易完成。
  5. 您应该使用Timer对象生成ActionEvents以驱动屏幕保护程序。将计时器设置为每500毫秒触发一次ActionEvent。这将导致您的actionPerformed方法执行,这应该只调用repaint方法。调用repaint方法会导致paintComponent方法执行。
  6. 您的paintComponent方法将完成所有工作,以在面板边界内选择随机颜色,随机形状和随机位置,并绘制该形状,并计算已绘制的形状数量。
  7. 创建一个私有方法,该方法在被调用时返回随机颜色,可以是任何可能的随机颜色值。此方法将从paintComponent方法和KeyListener事件处理程序中调用,如下所述。
  8. 您的paintComponent方法必须使用至少四种不同的形状,您可以从中随机选择...椭圆形,矩形,填充椭圆形,填充矩形,多边形,线条等。
  9. 您绘制的形状的大小和位置必须根据屏幕的大小而有所不同。绘制的每个形状的至少一部分必须在屏幕上可见。
  10. 使屏幕保护程序达到屏幕的整个大小。
  11. 将KeyListener添加到您的框架中。 KeyListener必须处理KeyPressed事件。
  12. 当按下'x'键时,KeyListener必须调用System.exit。
  13. 按下'z'键时,KeyListener必须将窗口大小从全屏大小更改为一半大小(屏幕宽度和高度的一半),或从一半大小更改为完整大小。也就是说,每次按下“z”键,显示屏的大小都会在全尺寸和半尺寸之间切换。这需要更改框架的大小并调用重绘。提示:请记住,为了重新绘制背景,您需要将计数设置为0。
  14. 按下'r'键时,KeyListener必须将显示背景的颜色更改为随机颜色。这意味着它必须获得一个新的随机颜色并使用新的随机颜色调用面板的setBackground。然后它必须调用重绘。提示:请记住,为了重新绘制背景,您需要将计数设置为0。

2 个答案:

答案 0 :(得分:2)

我会将问题/赋值视为依赖标准AWT事件循环而不是编码任何其他循环。所以这是事件,处理程序和事件的问题。再次触发。 (伪循环 - 在递归fn内部切换 - 不能很好地与AWT事件发送线程一起使用,所以我认为我们可以将该方法排除在外。)

以下是一些可能的方法:

'Timer'方法可以让您通过在稍后的时间间隔安排一个或多个事件来恢复执行。

'EventQueue'方法可让您自己发布一个事件,几乎立即恢复执行。

这两种方法都可以避免在代码中需要任何显式循环,而是让现有的事件调度循环重复调用它。

答案 1 :(得分: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");
                }
            }