Maison >Java >javaDidacticiel >Comment dessiner des lignes dans un JPanel en utilisant des clics de souris et en faisant glisser ?

Comment dessiner des lignes dans un JPanel en utilisant des clics de souris et en faisant glisser ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 16:12:10721parcourir

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

Dessiner des lignes dans un JPanel avec un clic sur un bouton

Problème :

Quelqu'un veut dessiner lignes dans un JPanel lorsqu'un bouton est cliqué mais rencontre des difficultés dues à une mauvaise compréhension du dessin processus.

Solution :

Pour tracer des lignes dans un JPanel, une approche différente est suggérée :

  1. Marquer le premier point de terminaison avec un cliquez.
  2. Faites glisser la souris pour afficher la ligne en cours.
  3. Relâchez la souris pour marquer le deuxième point de terminaison.

Implémentation :

Le code suivant illustre l'implémentation :

<br>import java. awt.BasicStroke;<br>importer java.awt.Color;<br>importer java.awt.Dimension;<br>importer java.awt.Graphics;<br>importer java.awt.Graphics2D;<br>importer java.awt.Point;<br>importer java.awt.RenderingHints;<br>importer java.awt.event.ActionEvent;<br>importation java.awt.event.KeyEvent;<br>importer java.awt.event.MouseAdapter;<br>importer java.awt.event.MouseEvent;<br>importer javax.swing.AbstractAction;<br>importer javax.swing. JButton;<br>importer javax.swing.JFrame;<br>importer javax.swing.JPanel;<br>import javax.swing.KeyStroke;</p>
<p>classe publique LinePanel étend 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();
        }
    });
}

}

Ce code fournit la fonctionnalité permettant de tracer des lignes en utilisant des clics de souris, un glisser-déposer et un relâchement, ainsi qu'un panneau de boutons pour contrôler le mouvement de la ligne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn