尝试在Java中创建消失的方块

尝试在Java中创建消失的方块,java,swing,Java,Swing,我的任务是创建消失的正方形,当它们向右移动时,它们会变小25%。当我运行代码时,它只创建一个正方形并停止。谁能帮我理解我做错了什么 消失的方块在向右移动时变小25% 好的,让我们退一步,把它分解一下 你需要知道 要覆盖的空间量 正方形已覆盖的空间量 广场的原始尺寸 当正方形到达另一侧时,其大小应小25% 当你有了所有这些,你可以计算出正方形在任何一点上的大小 要确定空间量,可以通过getWidth使用组件的宽度 要确定已覆盖的空间,可以先查看长方体的当前x位置 class GraphicsExa

我的任务是创建消失的正方形,当它们向右移动时,它们会变小25%。当我运行代码时,它只创建一个正方形并停止。谁能帮我理解我做错了什么

消失的方块在向右移动时变小25%

好的,让我们退一步,把它分解一下

你需要知道

要覆盖的空间量 正方形已覆盖的空间量 广场的原始尺寸 当正方形到达另一侧时,其大小应小25% 当你有了所有这些,你可以计算出正方形在任何一点上的大小

要确定空间量,可以通过getWidth使用组件的宽度

要确定已覆盖的空间,可以先查看长方体的当前x位置

class GraphicsExampleComponent extends JComponent

{
    //@Override
    public void paintComponent(Graphics g)
    {

        //make the first call to your recursive routine
    drawSquare1(g, 0, 0, 80);
        
    }
  public void drawSquare1(Graphics g, int x, int y, int size)
    {
    //draw a rectangle
     g.drawRect(x, y, size, size);
     g.fillRect(x, y, size, size);


    //reset the parameters
    x = x + size + 10;
    y = y + (size/4);
    size = size/4;

    //determine if you should call it again. 
        if (size<4 || x>600)
      drawSquare1(g, x, y, size);
    }
我们可以说,我们应该看盒子的中间部分,或者后缘,但这两个都很容易实现

接下来,我们需要知道从开始到结束大小的变化范围,然后我们可以使用它来计算要应用于长方体的增量

// Assuming that box is a instance of Rectangle
double progress = (double)box.x / (double)getWidth();
因此,这将提供一种方法,根据组件的当前水平位置来确定组件的大小

接下来,您需要一些方法来更新框的位置和更新UI

更好的解决方案之一是使用摆动计时器。这将允许您在更新之间以指定的延迟执行重复操作,这不会阻止UI,并将在事件调度队列中生成更新,这一点很重要,因为Swing不是线程安全的

请查看以了解更多详细信息

最后,我们所需要的是,通过组件的paintComponent方法,用当前状态更新组件。。。简单:P

可运行示例 消失的方块在向右移动时变小25%

好的,让我们退一步,把它分解一下

你需要知道

要覆盖的空间量 正方形已覆盖的空间量 广场的原始尺寸 当正方形到达另一侧时,其大小应小25% 当你有了所有这些,你可以计算出正方形在任何一点上的大小

要确定空间量,可以通过getWidth使用组件的宽度

要确定已覆盖的空间,可以先查看长方体的当前x位置

class GraphicsExampleComponent extends JComponent

{
    //@Override
    public void paintComponent(Graphics g)
    {

        //make the first call to your recursive routine
    drawSquare1(g, 0, 0, 80);
        
    }
  public void drawSquare1(Graphics g, int x, int y, int size)
    {
    //draw a rectangle
     g.drawRect(x, y, size, size);
     g.fillRect(x, y, size, size);


    //reset the parameters
    x = x + size + 10;
    y = y + (size/4);
    size = size/4;

    //determine if you should call it again. 
        if (size<4 || x>600)
      drawSquare1(g, x, y, size);
    }
我们可以说,我们应该看盒子的中间部分,或者后缘,但这两个都很容易实现

接下来,我们需要知道从开始到结束大小的变化范围,然后我们可以使用它来计算要应用于长方体的增量

// Assuming that box is a instance of Rectangle
double progress = (double)box.x / (double)getWidth();
因此,这将提供一种方法,根据组件的当前水平位置来确定组件的大小

接下来,您需要一些方法来更新框的位置和更新UI

更好的解决方案之一是使用摆动计时器。这将允许您在更新之间以指定的延迟执行重复操作,这不会阻止UI,并将在事件调度队列中生成更新,这一点很重要,因为Swing不是线程安全的

请查看以了解更多详细信息

最后,我们所需要的是,通过组件的paintComponent方法,用当前状态更新组件。。。简单:P

可运行示例 如果size<4 | | x>600,则该条件永远不会为真,因为第一次调用drawSquare1时,size=80,x=0。 将其更改为if size>4&&x如果size<4 | | x>600,则该条件永远不会为真,因为当首次调用drawSquare1时,size=80,x=0。
更改为“如果大小>4&&x谢谢大家的帮助”。不幸的是,我不能使用计时器,因为我们没有在课堂上学习它,我们不允许使用我们没有复习过的方法/代码。要解决这个问题,我必须将我的基本机箱的大小设置为>=4&&x<600。

谢谢大家的帮助。不幸的是,我不能使用计时器,因为我们没有在课堂上学习它,我们不允许使用我们没有复习过的方法/代码。要解决这个问题,我必须通过使其大小>=4&&x<600来解决我的基本情况。

如果size600,可能需要在检查size和x的值之前进行检查。他们似乎不符合那个条件。你调用drawSquare。。。方法每次使用相同的参数。因此,正方形将始终在同一位置以相同的大小绘制。您需要1一个摆动计时器来安排动画2每次计时器启动时,您需要更新正方形的x/y位置和大小。使用摆动计时器更新正方形的状态并重新绘制组件。如果大小600,请在开始之前检查大小和x的值。他们似乎不符合那个条件。你调用drawSquare。。。同杆法
每一次都是一次。因此,正方形将始终在同一位置以相同的大小绘制。您需要1一个摆动计时器来安排动画2每当计时器启动时,您需要更新正方形的x/y位置和大小。使用摆动计时器来更新正方形的状态并重新绘制组件您如何在没有计时器的情况下处理动画?你可以使用线程吗?还可以看看在没有计时器的情况下如何处理动画?你可以使用线程吗?也看到
import java.awt.*;
import javax.swing.*;

public class Main {

    Main() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        GraphicsExampleComponent board = new GraphicsExampleComponent();
        frame.add(board);
        frame.pack();
        frame.setVisible(true);
        board.animate();
    }

    public static void main(String[] args) {
        new Main();
    }
}

class GraphicsExampleComponent extends JComponent{

    private final static int W = 200, H = 100, MIN_SIZE = 4, STEP = 10, DELAY = 2000;
    private int x= 0, y = 0, size = 80;
    private Timer timer;

    void animate(){
        timer = new Timer(DELAY, e->drawSquare());
        timer.start();
    }

    public void drawSquare(){

        //check stop criteria 
        if (size < MIN_SIZE ||  x >= getWidth()) {
            timer.stop();
            return;
        }

        //reset the parameters
        x = x + size + STEP;
        y = y + size/4;
        size = size/4;
        repaint();
    }

    @Override
    public void paintComponent(Graphics g)  {
        super.paintComponent(g);
        //draw a rectangle
        g.fillRect(x, y, size, size);
        g.dispose();;
    }

    @Override
    public Dimension preferredSize() {
        return new Dimension(W, H);
    }
}