繁体   English   中英

矩形绘图 Java Swing

[英]Rectangle Drawing with Java Swing

基本上这段代码需要能够通过从一个角到另一个角的 2 点点击绘制一个矩形,然后根据 2 点点击的距离绘制矩形。 现在它可以工作,但它的拖动系统。 谁能帮忙?

package javaio;

import java.awt.*;
import java.awt.event.;
import javax.swing.*;

public class DrawingProgram extends JPanel implements ActionListener
{

     MouseHandler mouseHandler = new MouseHandler();
     Point p1 = new Point(0, 0);
     Point p2 = new Point(0, 0);
     boolean drawing;
    
    
    public DrawingProgram(){
        this.setPreferredSize(new Dimension(1000, 1000));
        this.addMouseListener(mouseHandler);
    }
    
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(p1.x, p1.y, p2.x, p2.y);
        repaint();
    }
    
    
    
    private class MouseHandler extends MouseAdapter {
    
        public void mouseClicked(MouseEvent e) {
            drawing = true;
            p1 = e.getPoint();
            p2 = p1;
            repaint();
        }
    
        public void mouseReleased(MouseEvent e) {
            drawing = false;
            p2 = e.getPoint();
            repaint();
        }
    }
    
    
     public void actionPerformed(ActionEvent e) {
        JFrame f = new JFrame("Draw Rectangle On Mouse Click");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new DrawingProgram());
        f.pack();
        f.setVisible(true);
        
    }

}

让它能够通过两点点击绘制一个矩形。

基本思想非常简单。 您必须跟踪第一次点击和第二次点击。 当两者都不是null时,您需要从它们创建一个矩形。

此示例不仅演示了这一点,还演示了如何通过使用MouseMotionListener提供形状创建的视觉反馈,如果您不想要它,也不难摆脱

在此处输入图像描述

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Point startPoint;
        private Rectangle2D rectangle;
        private Point currentPoint;

        public TestPane() {
            MouseAdapter mouseAdapter = new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (startPoint != null && rectangle != null) {
                        startPoint = e.getPoint();
                        rectangle = null;
                    } else if (startPoint == null) {
                        startPoint = e.getPoint();
                    } else {
                        // You could use a List of some kind to 
                        // keep track of all the shapes you've created
                        Point endPoint = e.getPoint();
                        rectangle = makeRectangle(startPoint, endPoint);
                    }
                    repaint();
                }

                @Override
                public void mouseMoved(MouseEvent e) {
                    currentPoint = e.getPoint();
                    repaint();
                }
            };
            addMouseListener(mouseAdapter);
            addMouseMotionListener(mouseAdapter);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        protected Rectangle2D makeRectangle(Point startPoint, Point endPoint) {
            int minX = Math.min(startPoint.x, endPoint.x);
            int minY = Math.min(startPoint.y, endPoint.y);
            int maxX = Math.max(startPoint.x, endPoint.x);
            int maxY = Math.max(startPoint.y, endPoint.y);
            return new Rectangle2D.Double(minX, minY, maxX - minX, maxY - minY);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (rectangle != null) {
                g2d.draw(rectangle);
            } else if (startPoint != null && currentPoint != null) {
                // These are guide lines, you can get rid of them if you prefer
                g2d.setColor(Color.LIGHT_GRAY);
                g2d.drawLine(startPoint.x, startPoint.y, currentPoint.x, currentPoint.y);
                g2d.draw(makeRectangle(startPoint, currentPoint));
            }
            g2d.dispose();
        }

    }
}

我会考虑看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM