我正在制作一个 GUI 应用程序,它可以查找并绘制一组点的凸包。
这是框架:
public class Frame extends JFrame{
Panel panel = new Panel();
JButton drawHull = new JButton("Draw Convex Hull");
Frame(String title) {
super(title);
// setLayout
setLayout(new BorderLayout());
// add components to the frame
add(panel, BorderLayout.CENTER);
add(drawHull, BorderLayout.SOUTH);
// add actionListener for drawHull button
drawHull.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
panel.drawConvexHull();
}
}
);
}
}
该框架包含一个按钮(位于框架底部)和一个 Panel
对象。
这是 Panel
类:
public class Panel extends JPanel{
ArrayList<Point> points = new ArrayList<Point>();
public Panel() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
points.add(new Point(e.getX(), e.getY()));
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
if(!points.isEmpty()) {
Point p = points.get(points.size()-1);
g.fillOval(p.x-2, p.y-2, 4, 4);
}
}
public void drawConvexHull() {
// code for finding convex hull
}
}
我在 Panel
类中添加了一个 mouseListener
,这样当用户单击面板上的任意位置时,就会绘制一个点。
当我运行代码时,一切看起来都很好。这是一个示例运行。
现在问题来了:
只要我点击面板,就会发生这种情况
框架顶部会出现一个按钮。 为什么会发生这种情况?
还有一件事。当我单击顶部的此按钮时,会绘制一个点。来,看一下:
最佳答案
如果不调用 paintComponent
中的 super.paintComponent(g)
,则不会重新绘制背景,从而导致面板组件出现不可预测的结果。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Point point: points) {
g.fillOval(point.x - 2, point.y - 2, 4, 4);
}
}
关于java - 自定义绘画未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297190/