我使用一个图像作为背景,然后将另一个图像用作JButton。背景图像当前与按钮重叠,所以你看不到它。当我注释repaint()out时,按钮在前面,但是因为我重新定位了按钮,所以这个空间从背景图像中消失了。那么,基本上,我必须如何处理我的代码才能将按钮放在背景图像前面(背景图像仍然完好无损)?
public class Start extends JFrame {
JPanel jp = new JPanel();
JButton startButton = new JButton();
private Image dbImage;
private Graphics dbg;
Image backgroundFirst;
int backx;
int backy;
public Start() {
ImageIcon i = new ImageIcon(
"C:/Users/Mel/workspace/camptycoon/javagame/src/javagame/background1.png");
backgroundFirst = i.getImage();
startButton
.setIcon(new ImageIcon(
"C:/Users/Mel/workspace/camptycoon/javagame/src/javagame/start.png"));
jp.add(startButton);
startButton.setLayout(getLayout());
add(jp);
validate();
// Frame Properties
setTitle("Counselor Training");
setVisible(true);
setSize(755, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public LayoutManager getLayout() {
int x = 540;
int y = 475;
startButton.setLocation(x, y);
startButton.setBorder(null);
return null;
}
public void paint(Graphics g) {
dbImage = createImage(getWidth(), getHeight());
dbg = dbImage.getGraphics();
paintComponent(dbg);
g.drawImage(dbImage, 0, 0, this);
}
public void paintComponent(Graphics g) {
backx = 10;
backy = 30;
g.setColor(Color.BLUE);
g.drawImage(backgroundFirst, backx, backy, this);
//repaint();
}
}
我知道一些常用的解决方案:
- 使用将图像保存在其ImageIcon中的JLabel作为内容窗格,确保为其提供一个像样的布局管理器,或者
- 使用JPanel作为contentPane,并使用其
paintComponent(...)
方法绘制图像 - 使用JLayeredPane,图像由最底层的组件(可能是JLabel)保存。我主要在动画工作中使用了这个,我想把组件/精灵从一个层提升到另一个层
附加说明:
- 不要忘记对所有您认为是重写的方法使用
@Override
注释,因为您可能会惊讶地发现其中一个实际上不是(即,上面的`paintComponent(…)方法) - 你几乎永远不会覆盖JFrame的
paint(...)
方法,因为它可能没有做你认为它在做的事情,而且你有不想要的副作用的危险 - 事实上,避免覆盖任何组件的
paint(...)
方法是个好主意 - 您应该尽量避免使用null布局
- 你的
getLayout()
方法覆盖在我看来很恶心。不要这样做 - 如果要在图像显示组件上嵌套JPanel,请确保通过调用其上的
setOpaque(false)
将覆盖的JPanel(或其他组件)设置为非不透明