【问题标题】:Custom Rectangle Class Not Working自定义矩形类不起作用
【发布时间】:2015-10-24 20:13:56
【问题描述】:

我创建了一个扩展 Rectangle(TransformRect) 的类。我希望它在 JPanel 上随机生成,然后随机移动。到目前为止,我的班级会自行生成,但不会随机移动。当我在我的 TranformPanel 中绘制我的 TransformRect 对象时,它似乎在实际生成之前运行了所有代码。它通过睡眠循环(try、catch)运行,然后使用随机坐标和 1 次使用移动方法实际生成自身。我不知道如何解决这个问题。

变换矩形

import java.awt.Rectangle;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class TransformRect extends Rectangle{ 
    //instance initializer
    {   
        Random rn = new Random(); 
        this.setBounds(rn.nextInt(450),rn.nextInt(450), 10, 10);   
        System.out.println(this.getBounds());

    }    
    public TransformRect(){ 
        try {  
            TimeUnit.SECONDS.sleep(1);
            this.translate(10, 10); 
            System.out.println(this.getBounds());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } 
    }
}  

转换面板

import javax.swing.*; 
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class TranformPanel extends JPanel {
    private double randomx = 0; 
    private double randomy = 0; 
    private int xlist[] = new int[20]; 
    private int ylist[] = new int[20]; 
    public void paintComponent(Graphics g) 
    { 
        super.paintComponent(g); 
        drawTransform(g,randomx,randomy);
    }  
    private void drawTransform(Graphics g,double randomx,double randomy) 
    {    
        Graphics2D g2d = (Graphics2D)g;    
        g2d.draw(new TransformRect()); 
    }
} 

EDIT- Camickr:我知道它只绘制一个 TransformRect。问题是翻译方法(this.translate(10, 10)) 不起作用。 TransformRect 并没有在页面周围移动,我不知道如何修复它。

提前致谢!

【问题讨论】:

    标签: java class graphics jpanel extends


    【解决方案1】:

    您的 TransformPanel 只绘制一个 TransformRect。

    如果你想绘制多个矩形,那么你需要保留一个包含所有矩形的列表并遍历列表来绘制每个矩形。

    查看Custom Painting Approaches 中的DrawOnComponent 示例。它有一个addRectangle(...) 方法,允许您添加一个矩形进行绘制。

    此外,每当您平移矩形位置时,您都需要在 TransformPanel 上调用 repaint() 来告诉它重新绘制自己。

    【讨论】:

    • 我知道它只绘制一个 TransformRect。问题是翻译方法(this.translate(10, 10)) 不起作用。 TransformRect 没有在页面上移动,我不知道如何修复它。
    • 你的代码的整个结构是错误的。我已经提到您需要在面板上调用 repaint() 以在新位置绘制对象。但是,当您这样做时,您会绘制一个新的 RectangleRect 实例,因此它将被绘制在其原始位置。
    • 我查看了 addRectangle() 方法和 DrawOnComponent 的其余部分,但我仍然不知道如何修复它。当您说调用 repaint() 时重新绘制 RectangleRect 时,我理解您的意思。我只是不知道如何修复它,所以它在重新绘制时转换矩形而不创建新实例。
    • @Ninjaman494,你的代码的基本结构需要改变。计时器应该是面板的一部分,而不是矩形。当 Timer 触发时,您在所有 Rectangle 上调用 translate(...) 方法是 ArrayList,因此所有 Rectangles(在我的示例中为 1 个或多个)同时更改。然后调用 repaint() 以便一次绘制所有 Rectangles。正如博客中的最​​后一行所说:玩得开心并尝试在示例中添加动画。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2015-02-07
    • 2014-09-30
    • 2017-03-14
    • 2015-05-04
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多