【问题标题】:Why is my image not filled with green?为什么我的图像没有填充绿色?
【发布时间】:2014-08-06 18:09:33
【问题描述】:

我看到了一个类似的问题,但我没有得到正确的解决方案,所以这是我的问题: (Coloring an area of BufferedImage)

我正在创建一个 BufferedImage,然后我从该图像中获取图形,我将在其上绘制一个绿色矩形并让它显示在 JPanel 中......但令人惊讶的是 - 它不是绿色的,我的错误在哪里??

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ViewPortTest {

    public static void main(String[] args) {
        new ViewPortTest().startUp();
    }


    private void startUp() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);        
        frame.add(new TestPanel() );
        frame.pack();       
        frame.setVisible(true);
    }

    private class TestPanel extends JPanel{

        private static final long serialVersionUID = 1L;
        private int myWidth = 256;
        private int myHeight = 156;     
        private BufferedImage img;      

        public TestPanel() {
            super();        
            setPreferredSize(new Dimension(myWidth, myHeight) );            
            img = new BufferedImage(myWidth, myHeight, BufferedImage.TYPE_4BYTE_ABGR);
            img.createGraphics();                   
            img.getGraphics().setColor(Color.GREEN);
            img.getGraphics().fillRect(0, 0, 256, 256);         
            img.getGraphics().dispose();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (img != null ){
                g.drawImage(img, 0, 0, null);
            }           
        }
    }
}

结果是这样的:

所以 - 我的绿色矩形在哪里???

【问题讨论】:

  • 你为什么dispose()图形?你仍然需要它来绘画。
  • 嗨彼得,它不会有任何区别 - 我在另一篇 SOF 文章中读到了关于处理图形的“提示”,但它不会有任何区别,试试你的拥有...
  • 覆盖paintComponent 不是一个好主意。可能会有所帮助:stackoverflow.com/questions/15544549/…
  • 嗨彼得,这幅画确实画好了,不是重绘的问题……但它是白色而不是绿色……
  • 嗨,彼得,如果您绘制组件(图形 gr)或简单地绘制(图形 gr)没有区别

标签: java swing graphics


【解决方案1】:

问题是多次调用getGraphics()。它正在创建多个 Graphics 对象。这本质上是createGraphics() 的别名。见BufferedImage#getGraphics。一个简单的解决方法是存储通过调用 createGraphics() 创建的 Graphics2D 对象,并对该对象进行所有调用:

Graphics2D g = img.createGraphics();                   
g.setColor(Color.GREEN);
g.fillRect(0, 0, 256, 256);         
g.dispose();

【讨论】:

  • 所以我很困惑 - createGraphics() 和 getGraphics() 的目的是什么也许你可以稍微解释一下为什么每次我要求时都会重新创建我的 Graphics?
  • 文档解释了getGraphics 的原因,它基本上是为了向后兼容。这也是一个糟糕的方法名称,因为它每次调用时都不会返回相同的对象(因此您会感到困惑)。基本上,您可以将其视为已弃用,因为createGraphics 提供了更好的接口并且更明确地命名。
  • a @depriated 对我有很大帮助...再次感谢您的解释和感谢,您对 getter/setter 确实有相同的理解...
【解决方案2】:

因为createGraphics() 总是返回一个新的Graphics2D 上下文。因此,您在一个上下文中设置了绿色,并使用另一个不知道您在另一个上下文中设置的绿色的矩形填充了一个矩形。

试试这个:

Graphics2d g = img.createGraphics();                   
g.setColor(Color.GREEN);
g.fillRect(0, 0, 256, 256);         
g.dispose();

【讨论】:

    【解决方案3】:

    Graphics 实例的简单问题:

      Graphics2D createGraphics = img.createGraphics();                   
      createGraphics.setColor(Color.GREEN);
      createGraphics.fillRect(0, 0, 256, 256);         
      createGraphics.dispose();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多