如何在图像(背景)上获得JButton



我使用一个图像作为背景,然后将另一个图像用作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(或其他组件)设置为非不透明

相关内容

  • 没有找到相关文章

最新更新