繁体   English   中英

在同一JLabel上绘制多个图形

[英]drawing multiple graphics on the same JLabel

我试图在同一个JLabel上绘制一个点,一个多边形和一个矩形,但不确定如何处理paintComponent方法。 目前,我可以使用两个扩展标签的不同类分别绘制点和多边形,但是当我尝试将它们放在同一类中时(因为我需要将它们都放在同一标签上),它会开始绘制多边形,而不会允许单独画点。

这是代码; 我需要调试代码的帮助。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.*;

class Drawing {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Draw Everything");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Test(new ImageIcon("map.JPG")));
        frame.pack();
        frame.setVisible(true);
    }
}

class Test extends JLabel
        implements MouseListener, MouseMotionListener {

    private boolean polygonDrawn = false;
    private final Point trackPoint = new Point();
    private static ArrayList polygonPoints = new ArrayList();
    private static Point point;

    public Test(ImageIcon imageIcon) {
        super(imageIcon, SwingConstants.LEFT);
        addMouseListener(this);
        addMouseMotionListener(this);

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (point != null) {
            Double x = point.getX();
            Double y = point.getY();
            g.setColor(Color.RED);
            g.fillOval(x.intValue(), y.intValue(), 5, 5);
        }

        int numPoints = polygonPoints.size();
        if (numPoints == 0) {
            return;
        }

        Point prevPoint = (Point) polygonPoints.get(0);

        Iterator it = polygonPoints.iterator();
        while (it.hasNext()) {
            Point curPoint = (Point) it.next();
            draw(g, prevPoint, curPoint);
            prevPoint = curPoint;
        }
        if (polygonDrawn) {
            draw(g, prevPoint, (Point) polygonPoints.get(0));
        } else {
            draw(g, prevPoint, trackPoint);
        }

    }

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

    @Override
    public void mouseClicked(MouseEvent evt) {
        int x = evt.getX();
        int y = evt.getY();

        switch (evt.getClickCount()) {
            case 1: // single-click
                if (polygonDrawn) {
                    polygonPoints.clear();
                    polygonDrawn = false;
                }
                polygonPoints.add(new Point(x, y));
                repaint();
                break;

            case 2: // double-click
                polygonDrawn = true;
                polygonPoints.add(new Point(x, y));
                repaint();
                break;

            default:
                break;
        }
    }

    @Override
    public void mouseMoved(MouseEvent evt) {
        trackPoint.x = evt.getX();
        trackPoint.y = evt.getY();
        repaint();
    }

    private void draw(Graphics g, Point p1, Point p2) {
        int x1 = p1.x;
        int y1 = p1.y;

        int x2 = p2.x;
        int y2 = p2.y;

        g.setColor(Color.RED);
        g.drawLine(x1 + 3, y1 + 3, x2 + 3, y2 + 3);

        g.setColor(Color.RED);
        g.fillOval(x1, y1, 8, 8);

        g.setColor(Color.RED);
        g.fillOval(x2, y2, 8, 8);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        point = new Point(x, y);
        repaint();

    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    @Override
    public void mouseDragged(MouseEvent e) {

    }
}

尚不清楚要实现什么,但是请注意,在绘制多边形时,您正在与绘制点完全相同的位置上绘制最新的固定多边形点。 要看到这一点,请使用

g.fillOval(x.intValue(), y.intValue(), 10, 10);

然后在draw方法中以其他颜色绘制多边形:

g.setColor(Color.BLUE);

暂无
暂无

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

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