Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在基本Java动画中更改颜色_Java_Swing_Loops_Animation_Awt - Fatal编程技术网

在基本Java动画中更改颜色

在基本Java动画中更改颜色,java,swing,loops,animation,awt,Java,Swing,Loops,Animation,Awt,我正在用Java处理图形(特别是通过Swing和AWT libs),希望在屏幕上移动一个圆圈(生成线条),并在线条到达画布边界时将x或y坐标设置回0。我对这部分代码没有问题 但是,现在我尝试在坐标都为0时清除屏幕(使用super.paint(Graphics))并更改颜色。屏幕清理工作正常,但我不能改变颜色。看起来,当坐标都为0时,在(0,0)位置所做的条纹下会出现指定颜色的椭圆形。一、 但是,希望条纹的颜色更改颜色,直到坐标重置为(0,0) 这是我的密码: @SuppressWarnings(

我正在用Java处理图形(特别是通过Swing和AWT libs),希望在屏幕上移动一个圆圈(生成线条),并在线条到达画布边界时将
x
y
坐标设置回0。我对这部分代码没有问题

但是,现在我尝试在坐标都为0时清除屏幕(使用
super.paint(Graphics)
)并更改颜色。屏幕清理工作正常,但我不能改变颜色。看起来,当坐标都为0时,在(0,0)位置所做的条纹下会出现指定颜色的椭圆形。一、 但是,希望条纹的颜色更改颜色,直到坐标重置为(0,0)

这是我的密码:

@SuppressWarnings(“串行”)
公共类游戏扩展JPanel
{
静态最终整数屏幕_X=300;
静态最终整数屏幕_Y=400;
int x=0;
int y=0;
私有void moveBall()
{
x+=1;
y+=1;
如果(x>=屏幕x)x=0;
如果(y>=屏幕y)y=0;
}
@凌驾
公共空间涂料(图g)
{
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
如果(x==0&&y==0)
{
超级油漆(g);
//在[0,5]中生成随机值
int rand_val=(new Random()).nextInt(5);
//Init随机颜色变量
颜色rand_Color=Color.black;
//随意挑选一种颜色
开关(随机值)
{
案例0:
兰德颜色=颜色。黑色;
打破
案例1:
rand_color=color.red;
打破
案例2:
rand_color=color.green;
打破
案例3:
蓝颜色=color.blue;
打破
案例4:
rand_color=color.gray;
打破
}
//我想我还需要做点什么?
//这可能是我的错误所在。。。
g2d.setColor(rand_color);
}
g2d.椭圆形(x,y,30,30);
}
公共静态void main(字符串[]args)引发InterruptedException
{
JFrame=新JFrame(“迷你网球”);
游戏=新游戏();
frame.add(游戏);
帧设置大小(屏幕X、屏幕Y);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while(true)
{
游戏。移动球();
游戏。重绘();
睡眠(10);
}
}
}
用于此油漆的
Graphics2D
实例即将被处理。现在更改颜色没有用


相反,更改组件(JPanel)本身的BG或FG颜色,然后在每次绘制之前设置图形对象的颜色。

注意更改和注释:

public class Game extends JPanel
{
    static final int SCREEN_X = 300;
    static final int SCREEN_Y = 400;
    int x = 0;
    int y = 0;

    private void moveBall()
    {
        x += 1;
        y += 1;

        if (x >= SCREEN_X) {
            x = 0;
        }
        if (y >= SCREEN_Y) {
            y = 0;
        }
    }

    @Override
    public void paintComponent(Graphics g) { //for custom painting override paint componenet

        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        if (x == 0 && y == 0)
        {
            // Generate random value in [0, 5)
            int rand_val = new Random().nextInt(5);

            // Init random color variable
            Color rand_color = Color.black;

            // Pick a random color
            switch (rand_val)
            {
            case 0:
                rand_color = Color.black;
                break;

            case 1:
                rand_color = Color.red;
                break;

            case 2:
                rand_color = Color.green;
                break;

            case 3:
                rand_color = Color.blue;
                break;

            case 4:
                rand_color = Color.gray;
                break;
            }

            g2d.setColor(rand_color);
            g2d.fillRect(0, 0, getWidth(), getHeight()); //clear screen 
        }

        g2d.fillOval(x, y, 30, 30);
    }

旁注:您可以定义颜色数组:

private final Color[] colors = {Color.black, Color.red, Color.green, Color.blue, Color.gray};
要使代码更简洁,请执行以下操作:

@Override
public void paintComponent(Graphics g) { //for custom painting override paint componenet

    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    if (x == 0 && y == 0)
    {
        int rand_val = new Random().nextInt(colors.length);
        Color rand_color = colors[rand_val];
        g2d.setColor(rand_color);
        g2d.fillRect(0, 0, getWidth(), getHeight()); //clear screen
    }

    g2d.fillOval(x, y, 30, 30);
}

上面的例子是关于动画的(1)&自定义绘制错误。我建议在关注任何其他内容之前,将其修改为经过尝试和测试的方法。1)动画应该从Swing
计时器调用,这样EDT不会被阻止。2)在所有使用自定义绘制的情况下,一个常量应该是调用
super
方法。如果
,则不调用
>这段代码来自一个游戏教程,所以它不是特定于动画的。它正在开始设置一个游戏。我只是在继续下一步之前玩它。“这段代码来自一个游戏教程…”“GI/GO”我只是在继续下一步之前玩它。”您的下一步应该是扔掉这些渣滓,然后使用从Java教程中获得的代码重新开始。绘制方法不应该更改组件的状态。它应该只绘制组件的当前状态。有关使用摆动计时器为多个“球”对象设置动画的工作示例,请参阅。
@Override
public void paintComponent(Graphics g) { //for custom painting override paint componenet

    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    if (x == 0 && y == 0)
    {
        int rand_val = new Random().nextInt(colors.length);
        Color rand_color = colors[rand_val];
        g2d.setColor(rand_color);
        g2d.fillRect(0, 0, getWidth(), getHeight()); //clear screen
    }

    g2d.fillOval(x, y, 30, 30);
}