使用KeyListener

时间:2017-11-09 09:55:12

标签: java swing methods colors keylistener

我有一个项目,一个圆圈随机的x和y值以及选定的颜色,但是当用户按下空格键时,必须更改圆圈的颜色。我的圆圈同时移动x和y坐标,我想按空格按钮时更改圆圈的颜色。但是当我按下它时它不起作用。它具有原始颜色。那么我怎样才能使这段代码正确?

public class c {
    private int x,y,r;
    private Color co;
    private int Re,G,B;
    private Random ran;

    public c() {
        // TODO Auto-generated constructor stub
        ran= new Random();
        x=100;
        y=50;
        r= ran.nextInt(200)+50;
        Re=ran.nextInt(255);
        G=ran.nextInt(255);
        B=ran.nextInt(255);
        co= new Color(Re,G,B); 
    }

    public int getRe() {
        return Re;
    }

    public int getG() {
        return G;
    }

    public int getB() {
        return B;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getR() {
        return r;
    }
    public void setCo(int Re,int G,int B) {
        co= new Color(Re,G,B);
    }
    public Color getCo() {
        return co;
    }

    public Random getRan() {
        return ran;
    }
    public void setX(int x) {
        this.x=x;
    }
    public void setY(int y) {
    this.y=y;
    }

}



public class Circle extends JFrame implements ActionListener,KeyListener{

    private Timer timer;
    private int x,y,a=5,b=5;
    private Random rand;
    c circ = new c();
    public Circle() {
        setLayout(new BorderLayout());
        x=circ.getX();
        y=circ.getY();
        timer=new Timer(50,this);
        timer.start();
        addKeyListener(this);
        setSize(550,550);
        setVisible(true);

    }

    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x,y,100,100);
        g.setColor(circ.getCo());
    }


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

    @Override
    public void actionPerformed(ActionEvent e) {

        moveWithTimer();
        repaint();      
    }

    public void moveWithTimer() {

        x=x+b;
        y=y+a;
    if(x<0) {
        b=5;
    }

    if(x+50>500) {
        b=-5;
    }

    if(y<0){
        a=5;
    }

    if(y+50>500) {
        a=-5;
    }



    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
       if(e.getKeyCode()==e.VK_SPACE) {
           circ.setCo(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255));


       }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

}

2 个答案:

答案 0 :(得分:2)

我建议您在绘制圆圈之前在paint(g)中设置图形对象的颜色。

public void paint(Graphics g) {
    super.paint(g);
    g.setColor(circ.getCo());
    g.fillOval(x,y,100,100);
}

通常,您不应该覆盖JFrame的paint()方法。相反,创建一个JPanel,将其添加到您的框架并覆盖面板的paintComponent()方法。

答案 1 :(得分:2)

  

但是当我按下它时它不起作用。它具有原始颜色。那么我怎样才能使这段代码正确?

KeyListener变幻莫测,更好地使用Key Bindings API来克服与KeyListener

相关的主要焦点问题

作为一般经验法则,您不应该覆盖paint等顶级容器的JFrame,它们是复合组件,而且它只是一个真正的混乱。

相反,请先使用JPanel并覆盖它的paintComponent方法。它通常更灵活。有关详细信息,请查看Performing Custom Painting

您的动作代码有误。您将圆类的x / y值分配给其他一些变量,这里的问题是,更改这些变量的值对圆圈类中的变量没有影响,相反,您需要分配回来......

public void moveWithTimer() {
    int x = circ.getX();
    int y = circ.getY();

    x = x + b;
    y = y + a;
    if (x < 0) {
        b = 5;
    }

    if (x + 50 > 500) {
        b = -5;
    }

    if (y < 0) {
        a = 5;
    }

    if (y + 50 > 500) {
        a = -5;
    }

    circ.setX(x);
    circ.setY(y);

}

你的&#34;圈&#34; class也可以使用其他几种方法。一个随机化颜色(它已经有一个Random对象,也可以使用它)和一个来绘制对象。

public class Circle {
    //...

    public void paint(Graphics2D g2d) {
        g2d.setColor(co);
        g2d.fillOval(x, y, r * 2, r * 2);
    }

    //...

    public void randomColor() {
        setCo(ran.nextInt(255), ran.nextInt(255), ran.nextInt(255));
    }

    //...

}

如果是我,我也很想添加move方法,但这就是我;)

作为一个可运行的例子......

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Timer timer;
        private int a = 5, b = 5;
        private Random rand;
        private Circle circ = new Circle();

        public TestPane() {
            timer = new Timer(50, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    moveWithTimer();
                    repaint();
                }
            });
            timer.start();

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = getActionMap();
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "spaced");
            am.put("spaced", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    circ.randomColor();
                    repaint();
                }
            });
        }

        public void moveWithTimer() {
            int x = circ.getX();
            int y = circ.getY();

            x = x + b;
            y = y + a;
            if (x < 0) {
                b = 5;
            }

            if (x + 50 > 500) {
                b = -5;
            }

            if (y < 0) {
                a = 5;
            }

            if (y + 50 > 500) {
                a = -5;
            }

            circ.setX(x);
            circ.setY(y);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            circ.paint(g2d);
            g2d.dispose();
        }

    }

    public class Circle {

        private int x, y, r;
        private Color co;
        private int Re, G, B;
        private Random ran;

        public Circle() {
            // TODO Auto-generated constructor stub
            ran = new Random();
            x = 100;
            y = 50;
            r = ran.nextInt(50) + 50;
            Re = ran.nextInt(255);
            G = ran.nextInt(255);
            B = ran.nextInt(255);
            co = new Color(Re, G, B);
        }

        public void paint(Graphics2D g2d) {
            g2d.setColor(co);
            g2d.fillOval(x, y, r * 2, r * 2);
        }

        public int getRe() {
            return Re;
        }

        public int getG() {
            return G;
        }

        public int getB() {
            return B;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        public int getR() {
            return r;
        }

        public void randomColor() {
            setCo(ran.nextInt(255), ran.nextInt(255), ran.nextInt(255));
        }

        public void setCo(int Re, int G, int B) {
            co = new Color(Re, G, B);
        }

        public Color getCo() {
            return co;
        }

        public Random getRan() {
            return ran;
        }

        public void setX(int x) {
            this.x = x;
        }

        public void setY(int y) {
            this.y = y;
        }

    }

}