每秒显示随机 Line2D.Double 的屏幕保护程序(JFrame 内的 JPanel)

Screensaver to display random Line2D.Double every second (JPanel inside JFrame)

我正在尝试创建一个每秒显示一条新的随机行的屏幕保护程序。它构建在嵌入 JFrame 的 JPanel 中。

问题是每次构建随机线时,它都会触及 JFrame 的边缘。我已将其设置为使该行始终位于 JPanel 内,但我不希望它每次都触及 JFrame 的边缘。

它从不在框架中间显示任何线条。我确定有一个简单的修复方法。我只是在寻找一双新的眼睛。我可能没有正确理解坐标系,谢谢。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.util.Random;

public class ScreenSaver extends JPanel implements ActionListener{
    Timer timer;
    int x1;
    int y1;
    int x2;
    int y2;

public ScreenSaver() {
    timer = new Timer(1000, this);
    timer.start();
}

    @Override
public void actionPerformed(ActionEvent e){
    repaint();
}

public void GetRandomValues(){

    Random randh = new Random();
    Random randw = new Random();

    // get width of JPanel
    int w = getWidth();

    // get height of JPanel
    int h = getHeight();

     x1 = randh.nextInt(h);
     x2 = randh.nextInt(h);
     y1 = randw.nextInt(w);
     x2 = randw.nextInt(w);

}

    @Override
public void paintComponent(Graphics g) {

   super.paintComponent(g);

   Graphics2D g2 = (Graphics2D) g;
   GetRandomValues();

   g2.draw(new Line2D.Double(x1, y1, x2, y2));
}

 public static void main (String[] args){

    ScreenSaver s1 = new ScreenSaver();        

    // jf is the JFrame
    JFrame jf = new JFrame();
    jf.setTitle("ScreenSaver.java");
    jf.setSize(800, 500);
    // puts frame in middle?
    jf.setLocationRelativeTo(null);
    jf.setVisible(true);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



    // panel inside frame
    jf.add(s1);
}

}

使用单个 Random 对象,初始化一次,不要在每个计时器上重新分配它。此外,坐标创建中存在混淆。应该是:

private Random random = new Random();

public void GetRandomValues(){
    // get width of JPanel
    int w = getWidth();

    // get height of JPanel
    int h = getHeight();

    x1 = random.nextInt(w);
    x2 = random.nextInt(w);
    y1 = random.nextInt(h);
    x2 = random.nextInt(h);
}

x 坐标应受宽度限制,y 坐标应受高度限制。你有另一种方式。