1

グリッドとクラスのdouble配列を作成しました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

レイヤーの全体的な構成により、実際にペイント効果を適切に機能させることが非常に困難になります。

ただし、マウスハンドラーイベントは次のようになります...

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

clickPointdragPointのインスタンスですjava.awt.Point

次の問題は、これをペイントすることです...

コンテンツの上にペイントできる必要があります。ダブルバッファリングされていないためpaint、個人的には避けたいと思いますが、代わりにオーバーライド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);
    }
}

提案

  • nullレイアウトは避けてください。それらは価値があるよりも面倒EmptyBorderです。必要に応じて、レイアウトマネージャー、複合コンポーネント、および s を組み合わせて使用​​する方がよいでしょう...
  • Threadスレッド管理に関しては、Swingには非常に特別なニーズがあります...
于 2013-01-07T01:34:56.673 に答える