java - 自定义绘画未按预期工作

标签 java swing jpanel awt

我正在制作一个 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,这样当用户单击面板上的任意位置时,就会绘制一个点。

当我运行代码时,一切看起来都很好。这是一个示例运行。

enter image description here

现在问题来了:

只要我点击面板,就会发生这种情况

enter image description here

框架顶部会出现一个按钮。 为什么会发生这种情况?

还有一件事。当我单击顶部的此按钮时,会绘制一个点。来,看一下:

enter image description here

最佳答案

如果不调用 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/

相关文章:

java - 如何从 URI(jena、RDF、dbpedia)获取所有属性?

java - MQ 队列应允许最大 5MB 的文件传输

用于聊天的 Java 样式 JList

java - 从 NetBeans GUI Builder 在 JPanel 中显示图像

java - 如何从 JTextField 中获取 Float 值?

java - 在 Mac OS 10.5.8 上设置 JAVA5_HOME 环境变量?

java - 为了解决 OC4J 10.1.3.5 中的 UnsupportedOperationException,首先要检查的是什么?

java - 如何将 JPanel 添加到 JScrollPane?

java - JTable滚动到行问题

java - 从一个面板类绘制到另一个面板类。