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

Java 为什么我的图像没有绿色?,java,swing,graphics,Java,Swing,Graphics,我见过一个类似的问题,但我没有得到正确的解决方案,所以我的问题是: 我正在创建一个BuffereImage,然后我从这个图像中获取图形,我将在它上面绘制一个绿色矩形,并让它显示在一个JPanel中。。。但令人惊讶的是,它不是绿色的,我的错误在哪里 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax

我见过一个类似的问题,但我没有得到正确的解决方案,所以我的问题是:

我正在创建一个BuffereImage,然后我从这个图像中获取图形,我将在它上面绘制一个绿色矩形,并让它显示在一个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);
            }           
        }
    }
}
结果是:


那么-我的绿色矩形在哪里?

问题在于对getGraphics的多次调用。它正在创建多个图形对象。这本质上是createGraphics的别名。看见一个简单的修复方法是存储通过调用createGraphics创建的Graphics2D对象,并对该对象进行所有调用:

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

问题在于对getGraphics的多次调用。它正在创建多个图形对象。这本质上是createGraphics的别名。看见一个简单的修复方法是存储通过调用createGraphics创建的Graphics2D对象,并对该对象进行所有调用:

Graphics2D g = img.createGraphics();                   
g.setColor(Color.GREEN);
g.fillRect(0, 0, 256, 256);         
g.dispose();
因为createGraphics总是返回一个新的Graphics2D上下文。因此,在一个上下文中设置绿色,然后使用另一个不知道在另一个上下文中设置的绿色的矩形填充矩形

试试这个:

Graphics2d g = img.createGraphics();                   
g.setColor(Color.GREEN);
g.fillRect(0, 0, 256, 256);         
g.dispose();
因为createGraphics总是返回一个新的Graphics2D上下文。因此,在一个上下文中设置绿色,然后使用另一个不知道在另一个上下文中设置的绿色的矩形填充矩形

试试这个:

Graphics2d g = img.createGraphics();                   
g.setColor(Color.GREEN);
g.fillRect(0, 0, 256, 256);         
g.dispose();
图形实例的简单问题:

  Graphics2D createGraphics = img.createGraphics();                   
  createGraphics.setColor(Color.GREEN);
  createGraphics.fillRect(0, 0, 256, 256);         
  createGraphics.dispose();
图形实例的简单问题:

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

为什么要处理这些图形?你仍然需要它在绘画上。嗨,彼得,这不会有任何区别-我在另一篇SOF文章中读到关于处理图形的“提示”,但这不会有任何区别,你自己试试吧…覆盖绘画组件不是一个好主意。可能会有帮助:嗨,彼得,这幅画的确是画出来的,这不是重新粉刷的问题。。。但是它是白色的而不是绿色的…嗨,彼得,如果你画组件图形gr或者简单地画图形gr没有区别。为什么你要处理图形?你仍然需要它在绘画上。嗨,彼得,这不会有任何区别-我在另一篇SOF文章中读到关于处理图形的“提示”,但这不会有任何区别,你自己试试吧…覆盖绘画组件不是一个好主意。可能会有帮助:嗨,彼得,这幅画的确是画出来的,这不是重新粉刷的问题。。。但它是白色的,不是绿色的……嗨,彼得,如果你画ComponentGraphics gr或者只是画Graphics gr没有区别,所以我很困惑-createGraphics和getGraphics的目的是什么?也许你可以稍微解释一下为什么每次我要求时都会重新创建我的图形?文档解释了getGraphics的原因,它基本上是为了向后兼容。对于一个方法来说,它也是一个糟糕的名字,因为它不会在每次调用它时返回相同的对象,因此您会感到困惑。基本上,您可以将其视为不推荐使用的,因为createGraphics提供了更好的界面,并且名称更明确。。。再次感谢您的解释,感谢您对getter/setter有相同的理解…所以我很困惑-createGraphics和getGraphics的目的是什么?也许您可以补充一点,解释一下为什么每次我要求时都会重新创建我的图形?文档解释了getGraphics的理由,它基本上是为了向后兼容。对于一个方法来说,它也是一个糟糕的名字,因为它不会在每次调用它时返回相同的对象,因此您会感到困惑。基本上,您可以将其视为不推荐使用的,因为createGraphics提供了更好的界面,并且名称更明确。。。再次感谢您的解释,感谢您对getter/setter的理解。。。