我试图在同一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) {
}
}
答案 0 :(得分:0)
您想要实现的目标并不完全清楚,但请注意,绘制多边形时,您将绘制与绘制点时完全相同的最新固定多边形点。要查看此内容,请使用
增加点的大小g.fillOval(x.intValue(), y.intValue(), 10, 10);
并在draw方法中绘制不同颜色的多边形:
g.setColor(Color.BLUE);