首页 >Java >java教程 >如何使用鼠标单击和拖动在 JPanel 中绘制线条?

如何使用鼠标单击和拖动在 JPanel 中绘制线条?

Barbara Streisand
Barbara Streisand原创
2024-12-24 16:12:10721浏览

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

通过单击按钮在 JPanel 中绘制线条

问题:

有人想要画画单击按钮时 JPanel 中的线条但由于误解而面临困难绘制过程。

解决方案:

要在 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;
导入 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