java - 试图制作一个创建2个移动矩形的java程序
问题描述
我是用java编写图形应用程序的新手,特别是我遇到了一些麻烦,它应该做的是它应该创建两个从右到左移动的矩形。我的问题是,由于某种原因,程序确实移动了矩形,但没有显示矩形,当它移动时,它们由于某种未知的原因而出现故障,只有两个边可见。这是代码:
矩形类:
import javax.swing.JComponent;
import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class TubeComponent extends JComponent
{
private final static int WIDTH = 20;
private Rectangle up, down;
private int windowLength;
private int windowWidth;
public TubeComponent(int aWidth, int aHeight)
{
windowLength = aWidth;
windowWidth = aHeight;
up = new Rectangle();
down = new Rectangle();
up.setLocation(windowWidth, 0);
int newHeight = (int)((windowLength - WIDTH) * Math.random());
up.setSize(WIDTH, newHeight);
down.setSize(WIDTH, windowLength - newHeight - WIDTH);
down.setLocation(windowWidth, (int) (up.getHeight() + WIDTH));
}
public void randomize()
{
up.setLocation(windowWidth, 0);
int newHeight = (int)((windowLength - WIDTH) * Math.random());
up.setSize(WIDTH, newHeight);
down.setSize(WIDTH, windowLength - newHeight - WIDTH);
down.setLocation(windowWidth, (int) (up.getHeight() + WIDTH));
repaint();
}
@Override
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.draw(up);
g2.draw(down);
System.out.println("ascissa " + getX() + " ordinata " + getY() + " altezza " + getHeight() + " larghezza " + getWidth());
}
public void moveBy(int dx, int dy)
{
up.translate(dx, dy);
down.translate(dx, dy);
repaint();
}
public int getX()
{
return (int) up.getX();
}
public int getY()
{
return (int) up.getY();
}
public int getHeight()
{
return (int) up.getHeight();
}
public int getWidth()
{
return (int) up.getWidth();
}
}
框架类:
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class Scene extends JFrame{
private final static int HEIGHT = 400;
private final static int WIDTH = 500;
private final static int SPEED = 4;
private final static int PING = 1;
private TubeComponent tube;
public Scene()
{
tube = new TubeComponent(WIDTH, HEIGHT);
add(tube);
setSize(HEIGHT, WIDTH);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("flappy");
ActionListener a = new TimeListener();
Timer t = new Timer(PING, a);
t.start();
}
private class TimeListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
tube.moveBy(-1, 0);
if(tube.getX() < -1*tube.getWidth())
{
tube.randomize();
}
System.out.println("ascissa " + tube.getX() + " ordinata " + tube.getY() + " altezza " + tube.getHeight() + " larghezza " + tube.getWidth());
}
}
}
可执行类:
import javax.swing.JFrame;
public class FrameViewer {
public static void main(String[] args)
{
Scene s = new Scene();
}
}
我留下了打印命令以显示矩形实际上存在并且没有超出范围。我试过简化这个类(通过让它打印一个静止的矩形来看看它是否是我的电脑,但即使它仍然没有工作,通过用一个静止的矩形编写另一个项目并且它可以工作。
解决方案
推荐阅读
- mongodb - $match 查询不适用于 mongodb 中的查找数组
- nginx - 在自己的域上重写和“托管”网址
- android - 为什么jw播放器不会全屏?
- android - 如何解决版本冲突的依赖问题?
- sql - 检查任何三个连续交易是否超过指定金额
- ruby - 我正在使用 MediaRecorder API 录制语音,为什么块小于实际大小?
- python - Keras mode.fit - 为什么每次新运行都会产生不同的结果(准确度和损失)?
- c - 为什么在进行远程过程调用时,UDP 优于 TCP?
- google-cloud-platform - 如何在现有的谷歌云虚拟机实例上启用嵌套虚拟化?
- sustainsys-saml2 - 带有 Owin 的 SAML2 - 无法进行身份验证