저는 프로젝트에서 임의의 모양을 그리는 화면 보호기를 만들고 있습니다. 몇 가지 질문이 있지만 지금 당면한 주요 관심사는 모양을 화면에 표시하고 모양을 만든 후에 사라지지 않게하는 것입니다. 여기 내 코드가있다. 나는 어떤 루프도 사용할 수 없으며 내가 가지고있는 것의 기능을 변경하려고하지 않는다. (아마도 shapeDrawn을 제외하고).Java에서 그려진 도형을 사라지게 유지하는 방법은 무엇입니까?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ScreenSaver2 extends JPanel implements ActionListener {
private JFrame frame = new JFrame("FullSize");
private Rectangle rectangle;
boolean full;
protected void paintComponent(Graphics g) {
int r = (int)(Math.random() * 255);
int gr = (int)(Math.random() * 255);
int b = (int)(Math.random() * 255);
Color color = new Color(r, gr, b);
int width = 10 + (int)(Math.random() * 40);
int height = 10 + (int)(Math.random() * 40);
int x = (int)(Math.random() * (getWidth() - width));
int y = (int)(Math.random() * (getHeight() - height));
int whichShape = (int)(Math.random() * 3);
int shapesDrawn = 0;
super.paintComponent(g);
if (shapesDrawn >= 30) {
shapesDrawn = 0;
}
switch (whichShape) {
case 0:
g.setColor(color);
g.drawLine(x, y, x + width, y + height);
shapesDrawn++;
break;
case 1:
g.setColor(color);
g.drawRect(x, y, width, height);
shapesDrawn++;
break;
case 2:
g.setColor(color);
g.drawRoundRect(x, y, width, height, 25, 25);
shapesDrawn++;
break;
case 3:
g.setColor(color);
g.drawOval(x, y, width, height);
shapesDrawn++;
break;
}
}
ScreenSaver2() {
// 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;
// set and initialize timer
Timer t = new Timer(500, this);
t.setDelay(500);
t.start();
}
// This method will run when any key is pressed in the window
class KeyHandler extends KeyAdapter {
public void keyPressed(KeyEvent e) {
// Terminate the program.
if (e.getKeyChar() == 'x') {
System.out.println("Exiting");
System.exit(0);
}
// Change background color
else if (e.getKeyChar() == 'r') {
System.out.println("Change background color");
setBackground(new Color((int)(Math.random() * 256), (int)(Math.random() * 256), (int)(Math.random() * 256)));
repaint();
}
// Resize to half-screen
else if (e.getKeyChar() == 'z') {
System.out.println("Resizing");
frame.setSize((int)rectangle.getWidth()/2, (int)rectangle.getHeight());
}
}
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public static void main(String[] args) {
ScreenSaver2 obj = new ScreenSaver2();
}
}
왜 루프를 사용할 수 없습니까? – nhgrif
@nhgrif 바보 같은 할당에 대한 제한 사항입니다 : P – MadProgrammer
당신은 계속 임의의 모양으로 repaint()를 호출하고 있습니다. 그러나 오래된 페인트를 유지하고 싶습니다. ~^ \t 공개 무효의 actionPerformed (ActionEvent의 전자)과 같은 것을 – Sage