在同一个JLabel上绘制多个图形

时间:2014-11-16 08:50:50

标签: java swing awt jlabel java-2d

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

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

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) {

    }
}

1 个答案:

答案 0 :(得分:0)

您想要实现的目标并不完全清楚,但请注意,绘制多边形时,您将绘制与绘制点时完全相同的最新固定多边形点。要查看此内容,请使用

增加点的大小
g.fillOval(x.intValue(), y.intValue(), 10, 10);

并在draw方法中绘制不同颜色的多边形:

g.setColor(Color.BLUE);