【问题标题】:Java draw line and pressKey to change colorJava画线和按键改变颜色
【发布时间】:2016-03-31 00:10:00
【问题描述】:

例如,我正在尝试画一条线,并在每次按“c”时更改颜色。我有 5 个布尔变量

boolean redColor = false;   
boolean blueColor = false; 
boolean greenColor = false;
boolean yellowColor = false;
boolean defaultColor = false;   

我有一个变量int counter = 0,我用它来增加函数keyPressed(KeyEvent e)。因为我有 5 个变量,所以当计数器达到值 6 时,我重置计数器并从 1 重新开始,颜色为红色。在paint() 方法中,我检查上面的那些布尔值,如果它们是真的,我改变颜色。

第一次,直到计数器重置,我可以改变颜色,但计数器重置后,我的颜色不会改变。我将在这里写下到底发生了什么:

counter = 1 => color red   
counter = 2 => color blue    
counter = 3 => color green   
counter = 4 => color yellow    
counter = 5 => color black(default)
counter = 6 => reset color back to 1   

直到这里一切正常,但是当计数器重置并再次递增时,对于任何计数器值,颜色仍然相同,黑色。
我将在这里写一部分代码,也许不是最好的方法,但我是 AWT 的新手。我希望为此使用awt。感谢您阅读我的帖子。

public void paint(Graphics g)
    {
        if(mousePressed == true)
        {
            g.drawLine(x1,y1,x2,y2);    
             if(redColor == true)
            {
                g.setColor(Color.RED);
                g.drawLine(x1,y1,x2,y2);    
            }
            if(blueColor == true)
            {
                g.setColor(Color.BLUE);
                g.drawLine(x1, y1, x2, y2);
            }
            if(greenColor == true)
            {
                g.setColor(Color.GREEN);
                g.drawLine(x1, y1, x2, y2);
            }
            if(yellowColor == true)
            {
                g.setColor(Color.YELLOW);
                g.drawLine(x1, y1, x2, y2);
            }
            if(defaultColor == true)
            {
                g.setColor(Color.BLACK);
                g.drawLine(x1, y1, x2, y2);
            }
        }
    }



public void keyPressed(KeyEvent e)
{
        if(e.getKeyChar() == 'c')
        {
            counter ++;
            if(counter == 1)
                redColor = true;
            if(counter == 2)
                blueColor = true;
            if(counter == 3)
                greenColor = true;
            if(counter == 4)
                yellowColor = true;
            if(counter == 5)
            {
                defaultColor= true;
            }
            else if(counter == 6)
                counter = 1;
        }
}

【问题讨论】:

    标签: java awt paint


    【解决方案1】:

    您将所有颜色都设置为 true 并且没有设置为 false,因此您最终会一遍又一遍地绘制同一条线,最终您看到的唯一颜色是黑色。一种解决方案是在您的按键方法中将所有布尔值设置为 false,然后只将正确的布尔值设置为 true。

    我自己我会通过使用颜色数组或 ArrayList 来做不同的事情,然后递增计数器并从数组中选择正确的项目。例如,

    private Color[] colors = { Color.RED, Color.BLUE, Color.GREEN, Color.YELLOW, Color.BLACK };
    private int index = 0;
    private Color color = Color.BLACK;
    
    public void keyPressed(KeyEvent e) {
    
        // if correct key pressed:
        if(e.getKeyChar() == 'c') {
            color = colors[index]; // select appropriate color
            repaint();
    
            index++;
            index %= colors.length;  // set index to 0 if == length of array
         }
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);   // *** don't forget me! ***
        g.setColor(color);
        // draw line with Color
        g.drawLine(x1, y1, x2, y2);
    }
    

    请注意这段代码有多简单。

    注意,如果这是 Swing,您将不会使用 KeyListeners,而是使用 KeyBindings,并且您将覆盖paintComponent,而不是paint。

    另外别忘了调用super的paint方法!

    【讨论】:

    • 是的,我看到了你的第一条评论,我做到了!现在它可以工作了,非常感谢你,圣诞快乐! :)
    • @ClaudiuM:不客气。请不要编辑答案。
    【解决方案2】:

    其他颜色设置为false,否则最后全部为true,所以第一次运行后是黑色的。

            if(counter == 1)
                redColor = true;
                blueColor = false;
                greenColor = false;
                yellowColor = false;
                blackColor = false;
            if(counter == 2)
                redColor = false;
                blueColor = true;
                greenColor = false;
                yellowColor = false;
                blackColor = false;
            if(counter == 3)
                //.....and so on
    

    【讨论】:

    • 我看过@Hovercraft Full Of Eels 的评论,我把它完全像这样:)。感谢你的回复 !成功了,圣诞快乐!
    • 更简单的方法是在块的开头将所有 xxxxColor 变量设置为 false,并且仅设置正确的变量为 true。这将大大缩短此代码,但 1+ 用于识别错误。
    • 谢谢,是的,我可以看到你的代码更好。
    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 2018-09-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多