当前位置: 首页 > 知识库问答 >
问题:

在基本Java动画中更改颜色

孙书
2023-03-14

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

然而,现在我试图在坐标均为0时清除屏幕(使用super.paint(图形))并更改颜色。屏幕清除工作正常,但我不能更改颜色。似乎,当坐标均为0时,在(0,0)位置的条纹下会出现指定颜色的椭圆形。然而,我希望条纹的颜色改变,直到坐标重置为(0,0)。

这是我的代码:

@SuppressWarnings("serial")
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 paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D) g;

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        if (x == 0 && y == 0)
        {
            super.paint(g);

            // 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;
            }

            // I'm assuming I need to do something more here?
            // This is likely where my mistake is...
            g2d.setColor(rand_color);
        }

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

    public static void main(String[] args) throws InterruptedException
    {
        JFrame frame = new JFrame("Mini Tennis");
        Game game = new Game();

        frame.add(game);
        frame.setSize(SCREEN_X, SCREEN_Y);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        while (true)
        {
            game.moveBall();
            game.repaint();
            Thread.sleep(10);
        }
    }
}

共有2个答案

贝杜吟
2023-03-14
// I'm assuming I need to do something more here?
// This is likely where my mistake is...
g2d.setColor(rand_color);

用于此油漆的Graphics2D实例即将被处理。现在换颜色没用。

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

荀增
2023-03-14

请注意更改和评论:

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);
}
 类似资料:
  • 我用html、jquery和css动画构建了一个“粘性头”。但有一件小事不能正常工作。 在这种情况下,棒头将是活动的,菜单的背景颜色从白色切换到绿色(带有动画)。 现在我需要一个函数,它将颜色从绿色切换回白色(与动画),如果头不再粘(=类粘将移除)。 我怎么才能意识到这一点呢? null null

  • 在我的项目中,我想实现一个语法突出显示功能。我的意思是,当用户在代码区键入代码时,文本将像IDE(Eclipse、Intellij、Netbeans)一样立即高亮显示。 例如,如果我们在IntellijJavaIDE中键入“import”,那么它会将单词“import”涂成蓝色。在我的项目中,我想实现同样的事情。 我的目标是用蓝色突出特定的关键词。例如,如果关键字是“mov”、“load”、“xo

  • 问题内容: 是的,语言规范定义结果为“ 2”。如果VM采取不同的方式,则不符合规范。 大多数编译器都会对此抱怨。以Eclipse为例,它将声称永远不会执行return块,但这是错误的。 编写这样的代码我需要知道如何执行此操作: 假设:我有这样的代码: 我想改变的颜色并以颜色为蓝色颜色绿色 M到红色的数字橙色 如何更改此文字的颜色?这些文本来自记事本,也可以直接在文本区域中键入。是非常糟糕的做法,永

  • 有没有办法在Java图形编程中更改各个颜色组件(除了bright()和darker()方法之外)?例如,如果我创建了一个包含r、g、b颜色成分的颜色对象,然后想修改其中一个,有没有办法? 有没有办法快速改变其中一种颜色成分?

  • 我想根据用户需要将我写的文本(和字体颜色)更改为另一种颜色。 我制作了一个JFrame,并添加了JTextPane。在文本窗格的右侧,我有一个不同颜色的列表(“白色”、“黑色”、“绿色”等)。Jframe还有一个JMenuBar,如果用户突出显示列表中的一个元素(比如黑色),我想更改textpane的背景色(我知道这很愚蠢,但这是老师的作业) 问题是,文本是黑色的,所以当我改变背景颜色时,文本“消

  • 问题内容: 有什么办法可以在Eclipse控制台中更改文本颜色? 我不是在谈论何时将选项从黑色更改为例如红色的颜色。 我的意思是,就像我启动程序并执行代码一样,它有时会更改颜色。 例如: 我不是在谈论guis jframes等。我是在谈论Eclipse控制台。 问题答案: 虑到可能是通过使用不同的: sss将消息写入消息控制台。 消息控制台可能连接了多个流。 每个流可以以不同的颜色显示 看到这个线