Heim >Java >javaLernprogramm >Wie zeichne ich Linien in einem JPanel mit Mausklicks und Ziehen?

Wie zeichne ich Linien in einem JPanel mit Mausklicks und Ziehen?

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

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

Zeichnen von Linien in einem JPanel mit Button-Klick

Problem:

Jemand möchte zeichnen Linien in einem JPanel, wenn auf eine Schaltfläche geklickt wird, stößt jedoch aufgrund eines Missverständnisses der Zeichnung auf Schwierigkeiten Prozess.

Lösung:

Um Linien in einem JPanel zu zeichnen, wird ein anderer Ansatz vorgeschlagen:

  1. Markieren Sie den ersten Endpunkt mit a Klicken Sie.
  2. Ziehen Sie die Maus, um die laufende Linie anzuzeigen.
  3. Lassen Sie die Maus los, um die zweite zu markieren Endpunkt.

Implementierung:

Der folgende Code demonstriert die Implementierung:

<br>import java.awt. BasicStroke;<br>import java.awt.Color;<br>import java.awt.Dimension;<br>java.awt.Graphics importieren;<br>java.awt.Graphics2D importieren;<br>java.awt.Point importieren;<br>java.awt.RenderingHints importieren;<br>import java.awt.event.ActionEvent;<br>importieren 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>importieren javax.swing.JFrame;<br>import javax.swing.JPanel;<br>import javax.swing.KeyStroke;</p>
<p>öffentliche Klasse LinePanel erweitert 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();
        }
    });
}

}

Dieser Code bietet die Funktionalität zum Zeichnen von Linien mit der Maus Klicken, Ziehen und Loslassen sowie ein Bedienfeld mit Schaltflächen zum Steuern der Bewegung der Linie.

Das obige ist der detaillierte Inhalt vonWie zeichne ich Linien in einem JPanel mit Mausklicks und Ziehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn