3

我目前正在学习 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”键时,显示器的尺寸都会在全尺寸和半尺寸之间切换。这需要更改框架的大小并调用 repaint。提示:请记住,为了使背景重绘,您需要将计数设置回 0。
  14. 当按下“r”键时,您的 KeyListener 必须将显示背景的颜色更改为随机颜色。这意味着它必须获得一个新的随机颜色并使用新的随机颜色调用面板的 setBackground。然后它也必须调用 repaint。提示:请记住,为了使背景重绘,您需要将计数设置回 0。
4

2 回答 2

2

我会将问题/作业理解为依赖于标准 AWT 事件循环......而不是编写任何额外的循环。所以这是事件、处理程序和重新触发的问题。(伪循环——在递归 fn 中切换——不能很好地与 AWT 事件调度线程配合使用,所以我认为我们可以排除这种方法)。

以下是一些可能的手段:

“计时器”方法将使您能够通过在以后的时间间隔安排一个或多个计时器事件来恢复执行。

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

这两种方法都将避免在您的代码中需要任何显式循环,而是使其能够被现有的事件调度循环重复调用。

于 2013-10-07T22:12:18.350 回答
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");
                }
            }
于 2013-10-07T22:50:43.053 回答