为什么我的图像没有填充绿色?

时间:2014-08-06 09:53:28

标签: java swing graphics

我见过类似的问题,但我没有得到合适的解决方案,所以这是我的问题: (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);
            }           
        }
    }
}

出来的是:

not green screen

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

试试这个:

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

答案 2 :(得分:1)

Graphics实例的简单问题:

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