0

我使用一个图像作为背景,然后我有另一个图像作为 JButton。背景图像当前与按钮重叠,因此您看不到它。当我注释掉 repaint() 时,按钮在前面,但是因为我重新定位了按钮,所以该空间从背景图像中淡出。所以基本上,我必须如何处理我的代码才能将按钮放在背景图像前面(背景图像仍然完好无损)?

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();
}

}
4

1 回答 1

3

我知道一些常用的解决方案:

  • 使用将图像保存在其 ImageIcon 中的 JLabel 作为您的 contentPane,确保为其提供体面的布局管理器,或者
  • 使用 JPanel 作为 contentPane 并在其paintComponent(...)方法中绘制图像。
  • 将 JLayeredPane 与最底层的组件(可能是 JLabel)保存的图像一起使用。我主要将其用于动画工作,我想将组件/精灵从一层提升到另一层。

补充说明:

  • 不要忘记为@Override您认为是覆盖的所有方法使用注释,因为您可能会惊讶地发现实际上不是(例如,您上面的 `paintComponent(...) 方法)。
  • 您几乎从不重写 JFrame 的paint(...)方法,因为它可能没有按照您认为的那样做,而且您有可能产生不必要的副作用。
  • 事实上,避免覆盖任何组件的paint(...)方法是个好主意。
  • 您应该努力避免使用空布局。
  • 你的getLayout()方法覆盖对我来说看起来很恶心。不要这样做。
  • 如果您想将 JPanel 嵌套在图像显示组件的顶部,请确保通过调用它们将覆盖的 JPanel(或其他组件)设置为不透明setOpaque(false)
于 2013-02-09T20:59:04.480 回答