【问题标题】:draw graphics outside of paint method在paint方法之外绘制图形
【发布时间】:2013-11-29 19:58:21
【问题描述】:
private void draw_shape() {                                         
    Graphics g = getGraphics();
    g.drawLine(0, 0, 100, 100);
    repaint();
}                                        

在paint方法中只绘制那些是paint方法的一部分的图形,因为它 我想在绘画方法之外绘制形状。 这段代码画了线,但它立即消失了,我不明白为什么会这样。请帮忙

【问题讨论】:

  • 问题更有可能出在getGraphics或repaint中,你不能在paint之外...
  • 顺便说一句 - 这是使用 Swing 还是 AWT 组件?

标签: java graphics awt


【解决方案1】:

这不起作用,因为您在 Swing repaint thread 之外获取了当前的 Graphics。基本上:

  • 你会得到当前的Graphics
  • 你在上面画了一些东西
  • 然后你调用repaint(),它将调用组件的paint(),从而丢弃你所做的一切

要使其工作,您应该覆盖对象的 paintpaintComponent 用于 Swing)方法:

@Override
public void paint(Graphics g) {
  super.paint(g); // if you have children to the component
  g.drawLine(..)
}

然后在修改某些内容时调用repaint()

【讨论】:

    【解决方案2】:

    这条线消失了,因为 Swing(或 AWT)将调用 paint(Graphics) 或 paintComponent(Graphics g) 来对组件进行调整。

    您需要做的是将您的绘图逻辑放在paint(Graphics) 或paintComponent(Graphics g) 方法上。后者更可取。

    如果您确实需要使用其他方法绘制事物,请将图像存储为类字段,然后在 paint 或 paintComponent 方法上绘制该图像。

    【讨论】:

      【解决方案3】:

      因为paint 方法也可以绘制东西。您不应该在paint 方法之外绘制图形。您应该改写paint方法,如下所示:

      @Override public void paint (Graphics g) {
          super.paint(g);
          g.drawLine(0, 0, 100, 100);
      }
      

      【讨论】:

        【解决方案4】:

        感谢帮助找到答案

        BufferedImage image = (BufferedImage) createImage(300, 300);
        image.getGraphics().drawLine(0, 0, 300, 300);
        jLabel1.setIcon( new ImageIcon(image ));
        

        【讨论】:

          猜你喜欢
          • 2011-04-12
          • 2012-02-21
          • 2010-10-04
          • 2012-12-20
          • 2018-08-23
          • 1970-01-01
          • 1970-01-01
          • 2017-06-27
          相关资源
          最近更新 更多