Home >Java >javaTutorial >How to Draw Lines in a JPanel Using Mouse Clicks and Dragging?

How to Draw Lines in a JPanel Using Mouse Clicks and Dragging?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 16:12:10721browse

How to Draw Lines in a JPanel Using Mouse Clicks and Dragging?

Drawing Lines in a JPanel with Button Click

Problem:

Someone wants to draw lines in a JPanel when a button is clicked but faces difficulties due to a misunderstanding of the drawing process.

Solution:

To draw lines in a JPanel, a different approach is suggested:

  1. Mark the first endpoint with a click.
  2. Drag the mouse to display the line in progress.
  3. Release the mouse to mark the second endpoint.

Implementation:

The following code demonstrates the implementation:

<br>import java.awt.BasicStroke;<br>import java.awt.Color;<br>import java.awt.Dimension;<br>import java.awt.Graphics;<br>import java.awt.Graphics2D;<br>import java.awt.Point;<br>import java.awt.RenderingHints;<br>import java.awt.event.ActionEvent;<br>import java.awt.event.KeyEvent;<br>import java.awt.event.MouseAdapter;<br>import java.awt.event.MouseEvent;<br>import javax.swing.AbstractAction;<br>import javax.swing.JButton;<br>import javax.swing.JFrame;<br>import javax.swing.JPanel;<br>import javax.swing.KeyStroke;</p>
<p>public class LinePanel extends JPanel {</p>
<pre class="brush:php;toolbar:false">private MouseHandler mouseHandler = new MouseHandler();
private Point p1 = new Point(100, 100);
private Point p2 = new Point(540, 380);
private boolean drawing;

public LinePanel() {
    this.setPreferredSize(new Dimension(640, 480));
    this.addMouseListener(mouseHandler);
    this.addMouseMotionListener(mouseHandler);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.blue);
    g2d.setRenderingHint(
        RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setStroke(new BasicStroke(8,
        BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
    g.drawLine(p1.x, p1.y, p2.x, p2.y);
}

private class MouseHandler extends MouseAdapter {

    @Override
    public void mousePressed(MouseEvent e) {
        drawing = true;
        p1 = e.getPoint();
        p2 = p1;
        repaint();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        drawing = false;
        p2 = e.getPoint();
        repaint();
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        if (drawing) {
            p2 = e.getPoint();
            repaint();
        }
    }
}

private class ControlPanel extends JPanel {

    private static final int DELTA = 10;

    public ControlPanel() {
        this.add(new MoveButton("\u2190", KeyEvent.VK_LEFT, -DELTA, 0));
        this.add(new MoveButton("\u2191", KeyEvent.VK_UP, 0, -DELTA));
        this.add(new MoveButton("\u2192", KeyEvent.VK_RIGHT, DELTA, 0));
        this.add(new MoveButton("\u2193", KeyEvent.VK_DOWN, 0, DELTA));
    }

    private class MoveButton extends JButton {

        KeyStroke k;
        int dx, dy;

        public MoveButton(String name, int code,
                final int dx, final int dy) {
            super(name);
            this.k = KeyStroke.getKeyStroke(code, 0);
            this.dx = dx;
            this.dy = dy;
            this.setAction(new AbstractAction(this.getText()) {

                @Override
                public void actionPerformed(ActionEvent e) {
                    LinePanel.this.p1.translate(dx, dy);
                    LinePanel.this.p2.translate(dx, dy);
                    LinePanel.this.repaint();
                }
            });
            ControlPanel.this.getInputMap(WHEN_IN_FOCUSED_WINDOW)
                .put(k, k.toString());
            ControlPanel.this.getActionMap()
                .put(k.toString(), new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    MoveButton.this.doClick();
                }
            });
        }
    }
}

private void display() {
    JFrame f = new JFrame("LinePanel");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(this);
    f.add(new ControlPanel(), BorderLayout.SOUTH);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            new LinePanel().display();
        }
    });
}

}

This code provides the functionality to draw lines using mouse clicks, drag, and release, as well as a panel of buttons for controlling the movement of the line.

The above is the detailed content of How to Draw Lines in a JPanel Using Mouse Clicks and Dragging?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn