首页 > 解决方案 > 试图制作一个创建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();
    }  
}

我留下了打印命令以显示矩形实际上存在并且没有超出范围。我试过简化这个类(通过让它打印一个静止的矩形来看看它是否是我的电脑,但即使它仍然没有工作,通过用一个静止的矩形编写另一个项目并且它可以工作。

标签: javaswing

解决方案


推荐阅读