我一直在尝试使用 Path2D 类与鼠标侦听器一起为我的 Java 绘图程序创建一个钢笔工具,但结果令人困惑。该工具将工作几秒钟,但随后整个应用程序将冻结并必须关闭。 (这里没有发生异常;程序只是冻结)。这是演示该问题的 SSCCE:
import java.awt.BasicStroke;
import java.awt.event.MouseAdapter;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PenDemoPanel extends JPanel {
private Point start;
private Point stop;
private Shape shape;
public PenDemoPanel() {
setBackground(Color.white);
setPreferredSize(new Dimension(600, 600));
PathListener listener = new PathListener();
addMouseListener(listener);
addMouseMotionListener(listener);
}
public void paintComponent(Graphics gc) {
super.paintComponent(gc);
Graphics2D g2 = (Graphics2D) gc;
if (start != null && stop != null) {
BasicStroke stroke = new BasicStroke(1);
shape = stroke.createStrokedShape(shape);
g2.draw(shape);
g2.fill(shape);
}
}
private class PathListener
extends MouseAdapter {
public void mousePressed(MouseEvent event) {
start = event.getPoint();
Path2D path = new Path2D.Double();
shape = path;
}
public void mouseDragged(MouseEvent event) {
stop = event.getPoint();
Path2D path = (Path2D) shape;
path.moveTo(start.x, start.y);
path.lineTo(stop.x, stop.y);
shape = path;
start = stop;
repaint();
}
public void mouseReleased(MouseEvent event) {
Path2D path = (Path2D) shape;
path.closePath();
shape = path;
repaint();
}
}
public static void main(String[] args) {
PenDemoPanel shapes = new PenDemoPanel();
JFrame frame = new JFrame("PenDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(shapes);
frame.pack();
frame.setVisible(true);
}
}
我自己写的Path
类,它在这里工作得很好,但我想使用 Path2D 类中的一些附加功能。
我在这里做错了什么,还是 Path2D 无法完成我想要做的事情?
任何帮助将不胜感激。
问题似乎来自将描边形状分配回形状。如果您避免这样做,则该应用程序。保持响应。维斯。
import java.awt.BasicStroke;
import java.awt.event.MouseAdapter;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D;
import javax.swing.*;
public class PenDemoPanel extends JPanel {
private Point start;
private Point stop;
private Shape shape;
public PenDemoPanel() {
setBackground(Color.white);
setPreferredSize(new Dimension(600, 600));
PathListener listener = new PathListener();
addMouseListener(listener);
addMouseMotionListener(listener);
}
public void paintComponent(Graphics gc) {
super.paintComponent(gc);
Graphics2D g2 = (Graphics2D) gc;
if (start != null && stop != null) {
BasicStroke stroke = new BasicStroke(1);
Shape strokedShape = stroke.createStrokedShape(shape);
g2.draw(strokedShape);
g2.fill(strokedShape);
}
}
private class PathListener
extends MouseAdapter {
public void mousePressed(MouseEvent event) {
start = event.getPoint();
Path2D path = new Path2D.Double();
shape = path;
}
public void mouseDragged(MouseEvent event) {
stop = event.getPoint();
Path2D path = (Path2D) shape;
path.moveTo(start.x, start.y);
path.lineTo(stop.x, stop.y);
shape = path;
start = stop;
repaint();
}
public void mouseReleased(MouseEvent event) {
Path2D path = (Path2D) shape;
try {
path.closePath();
} catch(Exception ingore) {
}
shape = path;
repaint();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
PenDemoPanel shapes = new PenDemoPanel();
JFrame frame = new JFrame("PenDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(shapes);
frame.pack();
frame.setVisible(true);
}
});
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)