每秒显示随机 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
坐标应受高度限制。你有另一种方式。
我正在尝试创建一个每秒显示一条新的随机行的屏幕保护程序。它构建在嵌入 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
坐标应受高度限制。你有另一种方式。