1

我创建了一个网格和我的类的双数组gridBalls

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

mousedragged如果我想说单击网格上的插槽 [0][0](假装它是一个球),将我的鼠标向右拖动并绘制一条水平线(在此输入 3),我的代码会是什么样子例如),或者如果我拖动鼠标底部并绘制一条垂直线(类型 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));
        }
    }
}
4

1 回答 1

1

The overall construction of you layers makes it very difficult to actually get the paint effect to work properly.

However, your mouse handler events would look something like...

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();
}

clickPoint and dragPoint are instances of java.awt.Point.

Your next problem is going to be getting this to paint...

You need to be able to paint over the content. Because paint isn't double buffered, I'd personally avoid it, instead, I would override paintChildren (as paintComponent will be painted UNDER every thing else)...

@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

  • Avoid null layouts. They are more trouble then they are worth, you'd be better of using a combination of layout managers, compound components and EmptyBorders as required...
  • Be careful with your Thread, Swing has some very particular needs when it comes to thread management...
于 2013-01-07T01:34:56.673 回答