当我使用 setBounds 时,Jcomponents 的 repaint 方法会绘制一个白色矩形

问题描述

我正在尝试为一个小游戏构建我的自定义按钮,我使用了一个带有如下图标的 JLabel

JLabel playButton = new JLabel("Play!",Images.getWoodImage(),JLabzl.CENTER);
playButton.setFont(Fonts.getBlueBerryFont());
playButton.setHorizontalTextPosition(SwingConstants.CENTER);
playButton.setVerticalTextPosition(SwingConstants.CENTER);
playButton.setBounds(230,400,300,100);

问题是我想让我的按钮在光标进入时移动一点;所以我不使用认布局(我放了 this.setLayout(null))。因此,对于我的按钮的 MouseListener,我使用了以下代码块:

    @Override
    public void mouseEntered(MouseEvent mouseEvent) {
        playButton.setBounds(240,410,100);   // x + 10 & y + 10
    }

    @Override
    public void mouseExited(MouseEvent mouseEvent) {
        playButton.setBounds(230,100);   // reverse the move
    }

但它没有按照我想要的方式工作,按钮确实移动了,但我在图标后面看到了这个白色矩形:

enter image description here

当我不移动按钮而只是改变前景颜色时,也会发生同样的情况。

有没有办法在不使用认布局的情况下防止这种情况发生?

解决方法

您可以使用以下方法将标签居中,而不是使用空布局:

panel.setLayout( new GridBagLayout() );
playButton.setBorder( new EmptyBorder(0,10,10) );
panel.add(playButton,new GridBagConstraints());

然后在 MouseListener 中尝试:

@Override
public void mouseEntered(MouseEvent mouseEvent) {
    playButton.setBorder( new EmptyBorder(10,0) );
}

@Override
public void mouseExited(MouseEvent mouseEvent) {
    playButton.setBorder( new EmptyBorder(0,10) );
}

这应该会产生图像移动的效果。

,

试试setOpaque(false)。还要确保您使用 .png 作为图片,因为 .jpg 图像始终具有白色背景。