Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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 JComponent不';重新绘制时不保持透明度,但调整大小时不保持透明度_Java_Paint_Jcomponent - Fatal编程技术网

Java JComponent不';重新绘制时不保持透明度,但调整大小时不保持透明度

Java JComponent不';重新绘制时不保持透明度,但调整大小时不保持透明度,java,paint,jcomponent,Java,Paint,Jcomponent,因此,我正在网格中绘制两个自定义JComponet。就像一个简单的战舰游戏。然而,我想给它们增加透明度。第一次渲染效果非常好,但是如果我调用repaint,那么alpha级别就会消失。然后,我可以调整帧的大小,它会自动更新,并具有正确的透明度 public class Cell extends JComponent implements MouseListener{ public static int CELL_SIZE=50; private boolean hit = false; priv

因此,我正在网格中绘制两个自定义JComponet。就像一个简单的战舰游戏。然而,我想给它们增加透明度。第一次渲染效果非常好,但是如果我调用repaint,那么alpha级别就会消失。然后,我可以调整帧的大小,它会自动更新,并具有正确的透明度

public class Cell extends JComponent implements MouseListener{
public static int CELL_SIZE=50;
private boolean hit = false;
private boolean hasShip = false;
private GridPoint location;
private boolean highlighted = false;
private GameBoard parent;

public static final Color HIT = new Color(Color.RED.getRed(),Color.RED.getGreen(),Color.RED.getBlue(),123);
public static final Color MISS = new Color(80,100,200,123);
public static final Color DEFAULT = new Color(0,0,(150),123);
public static final Color HIGHLIGHT = new Color(255,255,255,50);
public static final Color BORDER = new Color(0,0,40,123);

public Cell()
{
    setSize(Cell.CELL_SIZE,Cell.CELL_SIZE);
}
public Cell(GridPoint g, GameBoard p)
{
    setOpaque(false);
    addMouseListener(this);
    parent = p;
    setGridLocation(g);
    setLocation(CELL_SIZE*location.getX(), CELL_SIZE*location.getY());
    setSize(Cell.CELL_SIZE,Cell.CELL_SIZE);
}

public void paintComponent(Graphics g)
{
    if(hit == false)
    {
        if(highlighted)
        {
            g.setColor(HIGHLIGHT);
            g.fillRect(0, 0, Cell.CELL_SIZE, Cell.CELL_SIZE);
        }   
        g.setColor(DEFAULT);
        g.fillRect(0, 0, Cell.CELL_SIZE, Cell.CELL_SIZE);
    }
    else
    {
        if(hasShip)
        {
            g.setColor(Cell.HIT);
            g.fillRect(0, 0, Cell.CELL_SIZE, Cell.CELL_SIZE);
        }
        else
        {
            g.setColor(Cell.MISS);
            g.fillRect(0, 0, Cell.CELL_SIZE, Cell.CELL_SIZE);
        }
    }
    g.setColor(Cell.BORDER);
    g.drawRect(0, 0, Cell.CELL_SIZE, Cell.CELL_SIZE);
}

public GridPoint getGridLocation() {
    return location;
}
public void setGridLocation(GridPoint location) {
    this.location = location;
}
@Override
public void mouseClicked(MouseEvent e) {
    hit = true;
    repaint();
}
@Override
public void mouseEntered(MouseEvent e)
{
    highlighted = true;
    repaint();
}
@Override
public void mouseExited(MouseEvent e)
{
    highlighted = false;
    repaint();
}
@Override
public void mousePressed(MouseEvent e) {


}
@Override
public void mouseReleased(MouseEvent e) {


}
}


如果您在
paintComponent
方法的开头添加以下行,它应该可以工作

float alpha = 0.2f;
((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));

alpha 0.0f表示完全透明,1.0f表示不透明。

好的,我得到了答案。抱歉,这是其他代码领域的错误。出于某种原因,这些瓷砖是在JPanels背景色下渲染的。我所要做的就是将后面的JPanel设置为透明。

因为
颜色已经是基于alpha的,所以您只需混合alpha渲染即可。但是OP似乎做了错事,他们没有提供代码:P