我正在学习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();
}
}
答案 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");
}
}