首页 文章

鼠标在网格内移动

提问于
浏览
1

我创建了一个网格,以及我的类 gridBalls 的双数组 .

gridBalls 有一个 int 类型,你传给它一个数字来确定在网格中绘制什么,比如0空白,1球等 .

如果我想在我的网格上点击插槽[0] [0](假装它是一个球),将鼠标向右拖动并绘制一条水平线(类型3 in),我的_2422404中代码会是什么样子?这个例子),或者如果我拖动我的鼠标底部,它画了一条垂直线(类型2)

public class connectiontest extends JApplet implements Runnable, MouseListener, MouseMotionListener
{
    Thread t;

    int GRIDSIZE = 6;
    int gridLevel = 1;

    JPanel menuPanel = new JPanel (null);
    JPanel gamePanel = new JPanel (new GridLayout (GRIDSIZE, GRIDSIZE));
    gridBalls[] [] panelGrid = new gridBalls [GRIDSIZE] [GRIDSIZE];

    public void init ()
    {
        getContentPane ().setBackground (Color.black);
        getContentPane ().setLayout (null);
        setSize (600, 600);

        gamePanel.setBounds (80, 120, 450, 450);
        gamePanel.setEnabled (true);

        menuPanel.setBounds (10, 10, 580, 100);
        menuPanel.setBackground (Color.black);
        menuPanel.setOpaque (true);
        menuPanel.setBorder (BorderFactory.createLineBorder (Color.white, 1));

        getContentPane ().add (gamePanel);
        getContentPane ().add (menuPanel);

        t = new Thread (this);
        drawGrid ();
        levels ();
        t.start ();
    }


    public void run ()
    {
        while (t != null)
        {
            try
            {
                t.sleep (20);
            }
            catch (InterruptedException e)
            {
                break;
            }
        }
    }


    private void drawGrid ()
    {
        for (int row = 0 ; row < GRIDSIZE ; row++)
        {
            for (int col = 0 ; col < GRIDSIZE ; col++)
            {
                panelGrid [row] [col] = new gridBalls ();
                panelGrid [row] [col].setOpaque (true);
                panelGrid [row] [col].setBackground (Color.black);
                panelGrid [row] [col].clr = Color.black;
                panelGrid [row] [col].setBorder (BorderFactory.createLineBorder (Color.blue, 1));
                gamePanel.add (panelGrid [row] [col]);
                panelGrid [row] [col].addMouseListener (this);
                panelGrid [row] [col].addMouseMotionListener (this);
            }
        }
    }


    public void mouseClicked (MouseEvent e)
    {

    }


    public void mouseEntered (MouseEvent e)
    {

    }


    public void mouseExited (MouseEvent e)
    {

    }


    public void mousePressed (MouseEvent e)
    {

    }


    public void mouseMoved (MouseEvent e)
    {

    }


    public void mouseDragged (MouseEvent e)
    {
        for (int i = 0 ; i < GRIDSIZE ; i++)
        {
            for (int j = 0 ; j < GRIDSIZE ; j++)
            {
                if (e.getSource () == panelGrid [i] [j])
                {
                    repaint ();
                }
            }
        }
    }


    public void mouseReleased (MouseEvent e)
    {

    }


    public void levels ()
    {
        if (gridLevel == 1)
        {
            panelGrid [0] [0].clr = Color.green;
            panelGrid [0] [0].type = 1;
            panelGrid [4] [0].clr = Color.green;
            panelGrid [4] [0].type = 1;
            panelGrid [0] [5].clr = Color.blue;
            panelGrid [0] [5].type = 1;
            panelGrid [5] [2].clr = Color.blue;
            panelGrid [5] [2].type = 1;
            panelGrid [0] [4].clr = Color.red;
            panelGrid [0] [4].type = 1;
            panelGrid [3] [2].clr = Color.red;
            panelGrid [3] [2].type = 1;
            panelGrid [5] [0].clr = Color.magenta;
            panelGrid [5] [0].type = 1;
            panelGrid [0] [1].clr = Color.magenta;
            panelGrid [0] [1].type = 1;
            panelGrid [1] [4].clr = Color.orange;
            panelGrid [1] [4].type = 1;
            panelGrid [4] [2].clr = Color.orange;
            panelGrid [4] [2].type = 1;
            panelGrid [0] [2].clr = Color.cyan;
            panelGrid [0] [2].type = 1;
            panelGrid [2] [2].clr = Color.cyan;
            panelGrid [2] [2].type = 1;
            repaint ();
        }
    }
}

class gridBalls extends JLabel
{
    Color clr;
    int type = 0;


    public gridBalls ()
    {

    }


    public void paintComponent (Graphics g)
    {
        super.paintComponent (g);

        g.setColor (clr);
        // blank
        if (type == 0)
        {

        }
        // ball
        if (type == 1)
        {
            g.fillOval ((getWidth () / 10), (getHeight () / 10), (getWidth () - 14), (getHeight () - 14));
        }
        // vertical line
        if (type == 2)
        {
            g.fillRect ((getWidth () / 3), 0, (getWidth () / 3), getHeight ());
        }
        // horizontal line
        if (type == 3)
        {
            g.fillRect (0, (getHeight () / 3), (getWidth ()), (getHeight () / 3));
        }
        // corner piece top>right
        if (type == 4)
        {
            g.fillRect ((getWidth () / 3), 0, (getWidth () / 3), (getHeight () / 2));
            g.fillRect ((getHeight () / 3), (getHeight () / 3), (getWidth ()), (getHeight () / 3));
        }
        // corner piece top>left
        if (type == 5)
        {
            g.fillRect ((getWidth () / 3), 0, (getWidth () / 3), (getHeight () / 2));
            g.fillRect (0, (getHeight () / 3), (getWidth () / 3 + getWidth () / 3), (getHeight () / 3));
        }
        // corner piece bottom>right
        if (type == 6)
        {
            g.fillRect ((getWidth () / 3), (getHeight () / 2), (getWidth () / 3), (getHeight () / 2));
            g.fillRect ((getHeight () / 3), (getHeight () / 3), (getWidth ()), (getHeight () / 3));
        }
        // corner piece bottom>left
        if (type == 7)
        {
            g.fillRect ((getWidth () / 3), (getHeight () / 2), (getWidth () / 3), (getHeight () / 2));
            g.fillRect (0, (getHeight () / 3), (getWidth () / 3 + getWidth () / 3), (getHeight () / 3));
        }
    }
}

1 回答

  • 1

    层的整体构造使得实际上很难使绘画效果正常工作 .

    但是,您的鼠标处理程序事件看起来像......

    public void mousePressed(MouseEvent e) {
        clickPoint = e.getPoint();
        clickPoint = SwingUtilities.convertPoint(e.getComponent(), clickPoint, this);
    }
    
    public void mouseDragged(MouseEvent e) {
        dragPoint = e.getPoint();
        dragPoint = SwingUtilities.convertPoint(e.getComponent(), dragPoint, this);
        repaint();
    }
    

    clickPointdragPointjava.awt.Point 的实例 .

    你的下一个问题是要画这个......

    您需要能够绘制内容 . 因为 paint 不是't double buffered, I' d个人避免它,相反,我会覆盖 paintChildren (因为 paintComponent 将被绘制在其他所有东西之下)......

    @Override
    protected void paintChildren(Graphics g) {
        super.paintChildren(g);
        if (clickPoint != null && dragPoint != null) {
            g.setColor(Color.RED);
            g.drawLine(clickPoint.x, clickPoint.y, dragPoint.x, dragPoint.y);
        }
    }
    

    Suggestions

    • 避免 null 布局 . 他们比较值得更麻烦,你最好根据需要使用布局管理器,复合组件和 EmptyBorder 的组合......

    • 小心你的 Thread ,Swing在线程管理方面有一些非常特殊的需求......

相关问题