【问题标题】:How do I print a shape in a loop? [closed]如何循环打印形状? [关闭]
【发布时间】:2021-04-23 12:55:40
【问题描述】:

我正在尝试循环打印形状,但是当我运行程序时没有任何显示。我正在使用我之前制作的自定义类中的形状。我使用鼠标点击来获取鼠标的每一端(在不同的部分),这是有效的。

@Override 
public void paintComponent(Graphics g){
    super.paintComponent(g);
    for (int i = 0; i<howMany;i++){
        if (shapes[i] instanceof Line){ 
            Line l = (Line) shapes[i];
            g.drawLine((int)l.start.getX(),(int) l.start.getY(),(int) l.end.getX(),(int) l.end.getY());
            repaint();
        }
    }
}

【问题讨论】:

  • 字体线的形状是什么?
  • 但是当我运行程序时什么都没有显示 - 1) 你怎么知道数组包含任何行? 2)您是否将面板添加到框架中? 3) 你是否重写了 getPreferredSize() 来给面板一个大小?有关完整的工作示例,请参见 Custom Painting Approaches 中的 DrawOnComponent 示例。
  • 如果没有更多细节(组件的大小是多少?当前颜色和描边是多少?传入多少行?)这个问题无法真正回答。你能发布一个完整的、最小的程序来重现这个问题吗?
  • 谢谢大家。抱歉,如果这是愚蠢的哈哈,我刚刚开始编码并且有点困惑。现在修好了!
  • 现在修复它! - 怎么样?如果人们读到这篇文章,他们会想知道它是如何修复的。

标签: java swing paintcomponent repaint


【解决方案1】:

删除重绘请求并仔细检查shapes 不为空且shapes[i] 实际上是Line

public void paintComponent(Graphics g){
    super.paintComponent(g);
    for (int i = 0; i<howMany;i++){
        if (shapes[i] instanceof Line){ 
            Line l = (Line) shapes[i];
            g.drawLine((int)l.start.getX(),(int) l.start.getY(),(int) l.end.getX(),(int) l.end.getY());
           // repaint(); remove that 
        }
    }
}

【讨论】:

  • 虽然 repaint() 绝对不应该存在,但不会阻止组件自行绘制。它只会不断地绘制自己,增加 CPU 使用率,并可能降低代码的响应能力,因为它处于一个连续的循环中来绘制自己。
  • 调用repaint() 将组件标记为脏,以便在下次更新时重新绘制。连续多次调用它与只调用一次具有相同的效果。是的,它是多余的(只要应用程序运行,就会导致不断更新)——但它会继续工作。
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多