【问题标题】:Custom painting not working as intended自定义绘画未按预期工作
【发布时间】:2015-11-24 15:47:57
【问题描述】:

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

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

问题来了:

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

一个按钮出现在框架的顶部。 为什么会这样?

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

【问题讨论】:

    标签: java swing jpanel awt


    【解决方案1】:

    如果没有在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);
        }
    }
    

    【讨论】:

    • 如果我这样做:if(firstTime) { super.paintCompoenent(g); } 同样的事情会发生
    • 只需做super.paintComponent(g);
    • 另一种方法是每次添加一个点时清除面板并使用for循环再次绘制所有点。但我不想使用这种方法。
    • 如果我简单地添加super.paintComponent(g),前面的点就会被删除。只显示一个点
    • 按照您建议的方式进行操作在“肮脏”的彩绘面板上是混乱且不可预测的。刷新整个面板并绘制所有点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2018-03-09
    • 2017-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多