Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
透明度在java中不起作用_Java_Transparency - Fatal编程技术网

透明度在java中不起作用

透明度在java中不起作用,java,transparency,Java,Transparency,我有一个图像,有一个完全透明的背景。然而,当我画这幅图像时,ingame,它有一种阴影,我不知道为什么。我想把它弄出来。有人有主意吗?我没有名声去张贴它的图片显然。。。因此,我将尝试提供更多信息。 我用颜色。深灰色作为背景,当我画图像时,你会看到它周围有一个浅灰色的正方形。 然后,当我在彼此的上面画两张这样的图片时,那个正方形变得越来越亮 但是,如果我在另一个图像的顶部绘制图像,则不会出现这种效果 这里我加载图像 public BlackChip() { this.value = 500

我有一个图像,有一个完全透明的背景。然而,当我画这幅图像时,ingame,它有一种阴影,我不知道为什么。我想把它弄出来。有人有主意吗?我没有名声去张贴它的图片显然。。。因此,我将尝试提供更多信息。 我用颜色。深灰色作为背景,当我画图像时,你会看到它周围有一个浅灰色的正方形。 然后,当我在彼此的上面画两张这样的图片时,那个正方形变得越来越亮

但是,如果我在另一个图像的顶部绘制图像,则不会出现这种效果

这里我加载图像

public BlackChip() {
    this.value = 500;
    this.url = "res/images/poker/blackchip.png";
    this.file = new File(url);
    BufferedImage bi;
    try {
        bi = ImageIO.read(file);
        this.image = bi;
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public void renderChip(Chip chip, int x, int y) {
    g.drawImage(chip.getImage(), x, y, null);
}
在这里,我画的图像

public BlackChip() {
    this.value = 500;
    this.url = "res/images/poker/blackchip.png";
    this.file = new File(url);
    BufferedImage bi;
    try {
        bi = ImageIO.read(file);
        this.image = bi;
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public void renderChip(Chip chip, int x, int y) {
    g.drawImage(chip.getImage(), x, y, null);
}
这里我称之为方法

public void render() {
    screen.renderBackground(Color.DARK_GRAY);
    pokertable.render(Game.width / 2 - pokertable.getImage().getWidth(null) / 2, 50);
    screen.renderChip(cs.getWhiteChip(), 380, 310);
    screen.renderChip(cs.getRedChip(), 430, 310);
    screen.renderChip(cs.getGreenChip(), 480, 310);
    screen.renderChip(cs.getBlueChip(), 530, 310);
    screen.renderChip(cs.getBlackChip(), 580, 310); //this one is it
}
链接到图像:

嗯。。。这也不起作用,因为我需要10个声誉发布超过1个链接


你可以在这个链接上看到效果,它是一个具有完全透明背景的图像,绘制了多次。

我不知道这是否是问题的确切原因,因为你没有提供一个解决方案,但是使用了这个方法

public void renderChip(Chip chip, int x, int y) {
    g.drawImage(chip.getImage(), x, y, null);
}
只是看起来不对。所有自定义绘制都应在覆盖的
paintComponent
方法中提供的图形对象的上下文中完成。如果未在
JPanel
JComponent
中重写
paintComponent
,则可能无法正确绘制。你可能在做类似的事情

public class SomePanel extends JPanel {
    private Graphics g;

    public SomePanel() {
        g = getGraphics();
    }
}
public class SomePanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // do painting here
    }
}
public class Chip {
    private JComponent imageObserver;
    private BufferedImage chipImage;
    int x, y;

    public Chip(BufferedImage chipImage, int x, int y, JComponent imageObserver){
        this.chipImage;
        this.x = x;
        this.y = y;
        this.imageObserver = imageObserver;
    }
    public void renderChip(Graphics g) {
        g.getImage(chipImage, x, y, imageObserver);
    }
}
这是完全错误的。你应该做一些类似的事情

public class SomePanel extends JPanel {
    private Graphics g;

    public SomePanel() {
        g = getGraphics();
    }
}
public class SomePanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // do painting here
    }
}
public class Chip {
    private JComponent imageObserver;
    private BufferedImage chipImage;
    int x, y;

    public Chip(BufferedImage chipImage, int x, int y, JComponent imageObserver){
        this.chipImage;
        this.x = x;
        this.y = y;
        this.imageObserver = imageObserver;
    }
    public void renderChip(Graphics g) {
        g.getImage(chipImage, x, y, imageObserver);
    }
}
然后,类可以拥有自己的
render
方法,该方法将
Graphics
对象作为参数。然后可以在
paintComponent
方法中调用。也许像

public class SomePanel extends JPanel {
    private Graphics g;

    public SomePanel() {
        g = getGraphics();
    }
}
public class SomePanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // do painting here
    }
}
public class Chip {
    private JComponent imageObserver;
    private BufferedImage chipImage;
    int x, y;

    public Chip(BufferedImage chipImage, int x, int y, JComponent imageObserver){
        this.chipImage;
        this.x = x;
        this.y = y;
        this.imageObserver = imageObserver;
    }
    public void renderChip(Graphics g) {
        g.getImage(chipImage, x, y, imageObserver);
    }
}
你的小组呢

public class SomePanel extends JPanel {
    private List<Chip> chips;

    public SomePanel() {
        chips = new ArrayList<Chip>();
        // add new Chips
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Chip chip: chips) {
            chip.renderChip(g);
        }
    }
}
public类SomePanel扩展了JPanel{
私有列表芯片;
公共事务委员会(){
chips=新的ArrayList();
//添加新芯片
}
@凌驾
受保护组件(图形g){
超级组件(g);
用于(芯片:芯片){
chip.renderChip(g);
}
}
}

将此图像放到网上的某个位置,然后发布一个链接到该图像,该图像无法看到。提供权限以便我们可以查看。好的,很抱歉,您现在有权限了。我不扩展JPanel,我扩展了Canvas,所以我无法执行此操作。不管怎样,如果您正在扩展Canvas,那么您应该覆盖Canvas类的
paint
。所有自定义绘制都应在重写方法的上下文中完成。顺便说一句,你应该使用JPanel而不是重量级Canvas,使用Swing而不是AWT(如果你使用的是AWT的话)是的,我是,你知道我不是一个好的程序员,我只是自己开始尝试一些东西。我想感谢您的帮助,但是现在我遇到了更改代码的问题,所以它可以与JPanel XD一起使用。我对“BufferStrategy bs=getBufferStrategy();”有一个问题,您不需要它。对于双缓冲,您需要这样做,但是JPanel以及所有JComponents都是由DefaultSee进行双缓冲的,一般来说