java - JComponent 在重绘时不保持透明度,但在调整大小时保持透明度

标签 java paint jcomponent

所以我在网格中绘制几个自定义 JComponets。就像一个简单的战舰游戏。然而我想给它们添加透明度。它第一次渲染得很好,但如果我调用重绘,那么 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) {


}

}

Example

最佳答案

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

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

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

关于java - JComponent 在重绘时不保持透明度,但在调整大小时保持透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48550751/

相关文章:

java - 使用 paintThumb 我已经让我的箭头在 0 或 100 时从 JSlider 上掉下来,如何解决这个问题?

java - 容器在组件可见之前将其删除

java - 为什么 Java 中有 2 个 boolean 类型运算符?

android - 如何向我的绘图应用程序添加不透明度功能?

java - SimpleDateFormat 无法解析超过 4 位的毫秒数

java - 为什么我的组件一遍又一遍地重新绘制而没有发生任何变化?

java - BoxLayout 为自定义组件提供了意外的宽度

java - JPanel 的图形在左侧闪烁

JavaEE - EJB over SSL 仅当客户端和服务器位于同一主机时才有效

java - 如何格式化java文本编辑器项目中的文本?