[英]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.