repaint方法会绘制一个白色的矩形

ulydmbyx  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(333)

我正在尝试为一个小游戏建立我的自定义按钮,我使用 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) ). 因此,对于我的按钮鼠标听筒,我使用以下代码块:

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

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

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

同样的情况也会发生,当我不移动按钮,只是改变foregroundcolor。
有没有一种方法可以在不使用默认布局的情况下防止这种情况?

abithluo

abithluo1#

尝试 setOpaque(false) . 还要确保使用.png作为图片,因为.jpg图像总是有白色背景。

e4yzc0pl

e4yzc0pl2#

不使用空布局,您可以使用以下方法在面板上居中放置标签:

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

然后在鼠标中尝试:

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

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

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

相关问题