如何使这个火柴人变得互动?

时间:2017-11-30 17:47:49

标签: java swing graphics jpanel

所以,我需要通过用户输入使棒人移动。当用户点击一个部分(头部,手部,脚部和后部)时,他应该移动,并且不知道如何去做这件事。 如果可能的话,还需要围绕角色进行限制,可能是矩形,这样每个部件的拉伸距离都有限制。 请参阅下面的代码;

// Created by Charlie Carr - (28/11/17 - /11/17)
    import java.awt.*;
    import java.applet.Applet;
    import javax.swing.*;
    import java.awt.Graphics;
    import java.awt.geom.*;
    import java.awt.image.BufferedImage;
    //Imports complete

    //Suppress warning about undeclared static final serialVersionUID field in VS Code
    @SuppressWarnings("serial")
    public class Animator extends JPanel {
            public static class AnimatorWindow extends JPanel {
                    public void paint(Graphics page) {
                            setBackground(Color.gray);
                            setForeground(Color.white);
                            super.paintComponent(page);
                            page.drawString("Stickmen Animation Station", 150, 15);
                            //draw the head
                            //x1, y1, x2, y2
                            page.drawOval(90, 60, 20, 20);
                            // draw the body
                            page.drawLine(100, 80, 100, 110);
                            // draw the hands
                            page.drawLine(100, 90, 80, 105);
                            page.drawLine(100, 90, 120, 105);
                            //draw the legs, he hasn't a leg to stand on..
                            page.drawLine(100, 110, 85, 135);
                            page.drawLine(100, 110, 115, 135);
                    }
            }

            public static void main(String[] args) {
                    AnimatorWindow displayPanel = new AnimatorWindow();

                    JPanel content = new JPanel();
                    content.setLayout(new BorderLayout());
                    content.add(displayPanel, BorderLayout.CENTER);
                    //declare window size
                    int x = 480;
                    int y = 240;

                    JFrame window = new JFrame("GUI");
                    window.setContentPane(content);
                    window.setSize(x, y);
                    window.setLocation(101, 101);
                    window.setVisible(true);

            }

    }

1 个答案:

答案 0 :(得分:1)

使用MouseListener处理鼠标事件。

此外,您应该覆盖paintComponent()方法而不是paint(),因为paint()也会绘制边框和其他内容。

public static class AnimatorWindow extends JPanel implements MouseListener{
    public AnimatorWindow(){
        setBackground(Color.gray);
        setForeground(Color.white);
        //add the listener
        addMouseListener(this);
    }
    public void paintComponent(Graphics page) {
        super.paintComponent(page);
        //You should not alter the Graphics object passed in
        Graphics2D g = (Graphics2D) page.create();

        //draw your stuff with g
        g.drawString("Stickmen Animation Station", 150, 15);
        .......

        //finish
        g.dispose();
    }


    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}
    public void mouseClicked(MouseEvent e){
        //implement your clicking here
        //Use e.getX() and e.getY() to get the click position
    }
}

有关挥杆事件的更多信息,请查看this site

编辑:您的问题还包括动画,您可以使用javax.swing.Timer来执行此操作。