>Java >java지도 시간 >마우스 클릭과 드래그를 사용하여 JPanel에서 선을 그리는 방법은 무엇입니까?

마우스 클릭과 드래그를 사용하여 JPanel에서 선을 그리는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-24 16:12:10727검색

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

버튼 클릭으로 JPanel에서 선 그리기

문제:

그림을 그리고 싶은 사람이 있습니다. 버튼을 클릭했지만 도면에 대한 오해로 인해 어려움을 겪을 때 JPanel의 선 process.

해결책:

JPanel에서 선을 그리려면 다른 접근 방식이 제안됩니다.

  1. 첫 번째 끝점을 클릭하세요.
  2. 마우스를 드래그하여 라인을 표시하세요. 진행.
  3. 두 번째 끝점을 표시하려면 마우스를 놓습니다.

구현:

다음 코드는 구현을 보여줍니다.

<사전>
가져오기 java.awt.BasicStroke;
가져오기 java.awt.Color;
가져오기 java.awt.Dimension;
가져오기 java.awt.Graphics;
가져오기 java.awt.Graphics2D;
가져오기 java.awt.Point;
가져오기 java.awt.RenderingHints;
java.awt.event.ActionEvent 가져오기;
java.awt.event.KeyEvent 가져오기;
java.awt.event.MouseAdapter 가져오기;
java.awt 가져오기. event.MouseEvent;
가져오기 javax.swing.AbstractAction;
import javax.swing.JButton;
javax.swing.JFrame 가져오기;
javax.swing.JPanel 가져오기;
javax.swing.KeyStroke 가져오기;

공개 클래스 LinePanel은 JPanel을 확장합니다. {

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

}

이 코드는 마우스 클릭, 끌기, 놓기를 사용하여 선을 그리는 기능과 버튼 패널을 제공합니다. 라인의 움직임을 제어합니다.

위 내용은 마우스 클릭과 드래그를 사용하여 JPanel에서 선을 그리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.