2

所以我为纸牌游戏 War 创建了一个程序。一切都完成了,除了我想添加一个背景。问题是我不知道如何添加背景图片,以便其他 JLabels 和 JButtons 仍然出现在图片的顶部。是否可以为我设置背景图片,以便其他面板也显示在顶部?到目前为止,我的程序是这样的:

public War()
{
    JFrame frame = new JFrame();

    frame.setSize(500, 500);
    frame.setTitle("WAR");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());

    //Set up for background image
    Background = new JPanel();
    Background.add(new Background("Background.png"));
    frame.add(Background);
    Background.setLayout(new OverlayLayout(Background));

    cardPanel = new JPanel (new GridLayout(2,1));
    ///create labels and init with card back
    String strCard1 = "cardback.png";
    String strCard2 = "cardback.png";
    lblPlayer1Card = new JLabel(new ImageIcon(strCard1));
    lblPlayer2Card = new JLabel(new ImageIcon(strCard2));
    cardPanel.add(lblPlayer1Card);
    cardPanel.add(lblPlayer2Card);

    //Create panels for when war is played
    warPanel = new JPanel (new GridLayout(2, 3));
    String emptycards = "blankcard.png";
    player1war1 = new JLabel(new ImageIcon(emptycards));
    player1war2 = new JLabel(new ImageIcon(emptycards));
    player1war3 = new JLabel(new ImageIcon(emptycards));
    player2war1 = new JLabel(new ImageIcon(emptycards));
    player2war2 = new JLabel(new ImageIcon(emptycards));
    player2war3 = new JLabel(new ImageIcon(emptycards));
    warPanel.add(player1war1);
    warPanel.add(player1war2);
    warPanel.add(player1war3);
    warPanel.add(player2war1);
    warPanel.add(player2war2);
    warPanel.add(player2war3);


    // Create a panel
    btnPanel = new JPanel(new GridLayout(2,2));
    //set up next card button
    JButton btnNext = new JButton("Next Card");
    NextListener listener1 = new NextListener();
    btnNext.addActionListener(listener1);
    //set up new game button
    JButton btnNewGame = new JButton("New Game");
    NewGameListener listener2 = new NewGameListener();
    btnNewGame.addActionListener(listener2);


    //Sets up new panel showing size of main pile and discard pile of both players
    statusPanel = new JPanel(new GridLayout(4,2));

    //status labels that show the size of piles
    status1 = new JLabel("");// Size of player 1's main pile
    status2 = new JLabel("");//Size of player 1's discard pile
    status3 = new JLabel("");//Size of player 2's main pile
    status4 = new JLabel("");//Size of player 2's discard pile
    statusWar = new JLabel("");//Status label that shows the winner of War
    statusEmpty1 = new JLabel(""); // Creates empty status to put space between War status and size statuses
    statusEmpty2 = new JLabel(""); // Creates empty status to put space between War status and size statuses

    statusBar = new JLabel("");

    //Adds the labels to the panels
    btnPanel.add(btnNext);
    btnPanel.add(btnNewGame);
    btnPanel.add(statusBar);
    statusPanel.add(status1);
    statusPanel.add(status2);
    statusPanel.add(status3);
    statusPanel.add(status4);
    statusPanel.add(statusEmpty1);
    statusPanel.add(statusEmpty2);
    statusPanel.add(statusWar);

    cardPanel.setOpaque(false);
    btnPanel.setOpaque(false);
    statusPanel.setOpaque(false);
    warPanel.setOpaque(false);

    //The layout of the frame
    Background.add(cardPanel, BorderLayout.WEST);
    Background.add(btnPanel, BorderLayout.SOUTH);
    Background.add(statusPanel, BorderLayout.NORTH);
    Background.add(warPanel, BorderLayout.EAST);

    frame.setVisible(true);
}
4

2 回答 2

2

创造你的自我JLabel。加载图像并将其应用于标签 ( JLabel#setIcon)。

将标签布局管理器设置为您需要的。像往常一样将其他组件添加到标签中。

将标签添加到框架中。

看一眼

举些例子

于 2012-12-19T03:47:00.083 回答
1

使“框架”成为匿名内部类。覆盖“绘画”方法。通过作为“paint”中的参数发送的 Graphics 对象绘制背景图像。然后,调用超类的“paint”,绘制所有的GUI元素。例子:

final Image backgroundImage = ...(load image);
JFrame frame = new JFrame() {
    @Override
    public void paint(java.awt.Graphics g) {
        g.drawImage(backgroundImage); // draw the background image
        super.paint(); // call the superclass method so all the 
                                // GUI elements are still drawn.
    }
};

当然,如果您对他们有一些私人恩怨,您不必将其设为匿名内部类。你总是可以这样做:

public class GameFrame extends JFrame {
    private Image backgroundImage;
    public GameFrame() {
        super(); // call the super constructor 
        backgroundImage = ...(load image);
    }
    @Override
    public void paint(java.awt.Graphics g) {
        g.drawImage(backgroundImage); // draw the background image
        super.paint(); // call the superclass method so all the 
                                // GUI elements are still drawn.
    }
}

编辑:我正在看这个,你可能必须用 JPanel“背景”而不是 JFrame“框架”来做我在这里展示的事情,因为它看起来像 JPanel 完全覆盖了“框架”。如果用继承 JFrame 的类做我在这里展示的事情不起作用,我会认为这是因为 JPanel 覆盖了在 JFrame 上绘制的任何东西,所以除了“背景”之外,只需做同样的事情。

于 2012-12-19T01:02:50.107 回答