首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java Swing绘制矩形图

用Java Swing绘制矩形图
EN

Stack Overflow用户
提问于 2022-03-24 09:30:25
回答 1查看 102关注 0票数 0

基本上,这段代码需要能够绘制一个从一个角到另一个角的2点点击的矩形,然后根据2点点击的距离绘制矩形。现在它起作用了,但它的拖曳系统。有人能帮忙吗?

代码语言:javascript
复制
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);
        
    }

}

这样它就能够用两点点击绘制一个矩形。

EN

回答 1

Stack Overflow用户

发布于 2022-03-24 09:44:24

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

这个例子不仅说明了这一点,而且还演示了如何通过使用MouseMotionListener来提供形状创建的视觉反馈,如果您不想要它,就不难摆脱它。

代码语言:javascript
复制
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();
        }

    }
}

我会考虑看看:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71599937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档