1

I've created a grid, and a double array of my class gridBalls.

gridBalls has an int type, and you pass to it a number to determine what to draw in the grid, like 0 blank, 1 ball etc.

What would the code look like in my mousedragged if I wanted to lets say click on the slot [0][0] on my grid (pretend its a ball), drag my mouse to the right and draw a horizontal line (type 3 in this example), or if I dragged my mouse bottom and it drew a vertical line (type 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));
        }
    }
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • 3
    This `getContentPane().setLayout(null);` and `t = new Thread(this);` scare the willies out of me...You may also want to familiarise your self with the [Java coding conventions](http://www.oracle.com/technetwork/java/codeconv-138413.html) - You're not going to win any friends by ignoring them – MadProgrammer Jan 07 '13 at 00:30

1 Answers1

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...
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366