1

ランダムな図形を描画するスクリーン セーバーを作成するプロジェクトに取り組んでいます。いくつか質問がありますが、現在の私の主な関心事は、図形が作成された後に消えるだけでなく、図形を画面に残す方法です。これが私のコードです。私はループを使用できず、まだ持っているものの機能を変更するつもりはありません (おそらく shapeDrawn 以外)。

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();
    }
}
4

1 に答える 1