Java JFrame添加背景图像后,JPanel/JButtons消失

Java JFrame添加背景图像后,JPanel/JButtons消失,java,image,layout,jframe,Java,Image,Layout,Jframe,这里是Java新手。。。 我正在尝试将图像添加到JFrame的背景中。我已经在面板上添加了按钮,在那个框架上。当我将图像添加到JFrame时,我的按钮消失了 公共类背板扩展JFrame{ JFrame frame = new JFrame("Blackjack Game"); ImageIcon background; JLabel backgroundLbl; JButton newRoundButton; JButton endButton; ImageIcon image; pub

这里是Java新手。。。 我正在尝试将图像添加到JFrame的背景中。我已经在面板上添加了按钮,在那个框架上。当我将图像添加到JFrame时,我的按钮消失了

公共类背板扩展JFrame{

JFrame frame = new JFrame("Blackjack Game");

ImageIcon background;
JLabel backgroundLbl;

JButton newRoundButton;
JButton endButton;

ImageIcon image;

public BackPanel(GameConsole game){

    final GameConsole game1 = game;
    frame.setSize(800, 600);
  //frame.setLayout(new FlowLayout());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   

  //frame.setContentPane(new JLabel(new ImageIcon(getClass().getResource("cardBackground.jpg"))));
    ImagePanel panel = new ImagePanel("cardBackground.jpg");
    panel.setPreferredSize(new Dimension(800, 600));



    //put frame in the middle of the screen
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation(dim.width/2-frame.getSize().width/2, dim.height/2-frame.getSize().height/2);


    //create 2 buttons on the panel

    panel.add(endButton);
    panel.add(newRoundButton);
    frame.getContentPane().add(panel, BorderLayout.CENTER);   //add the panel to the frame

//  frame.pack();
    frame.setVisible(true);
    }
}
我有一种感觉,它与布局有关,但当我使用其他布局时,它似乎没有帮助,或者它也会使图像消失

我已经将文件从“cardBackground.jpg”更改为“”,以便查看按钮是否位于图像下方。它们不是

我试着加宽框架,看看按钮是否在图像旁边,但它们不是(这毫无意义,因为它们不在同一个面板上)

我错过了什么

编辑: 更新的代码不起作用:显示按钮但没有背景图像

import java.awt.Dimension;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class BackPanel{

    public BackPanel(GameConsole game){
        final GameConsole game1 = game;

        JFrame frame = new JFrame("Blackjack Game");
        ImagePanel panel = new ImagePanel("cardBackground.jpg");
        panel.setPreferredSize(new Dimension(800, 600));


        //create 2 buttons on the panel
        JButton newRoundButton= new JButton("Start another round");
        newRoundButton.setPreferredSize(new Dimension(150, 50));
        newRoundButton.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                game1.userTurn();
            }
        });

        JButton endButton = new JButton("End Game");
        endButton.setPreferredSize(new Dimension(150, 50));
        endButton.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "You have chosen to quit.\n"
                        + "Thank you for playing Blackjack.");
                System.exit(0);
            }
        });

        panel.add(endButton);
        panel.add(newRoundButton);

        frame.add(panel);
        frame.setSize(800, 600);

        frame.setLocationRelativeTo(null);


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        frame.setVisible(true);
        }
    }

不要像这样添加图像背景,而是创建一个新的JPanel类,该类有一个重载的paintComponent()函数用于绘制图像。下面是一个示例此解决方案的链接:

快乐编码

编辑:

我在Eclipse中创建了一个示例,一切都很好。下面是我使用的代码:

import java.awt.Dimension;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Test {
    public static void main(String[] args) throws IOException {
        JFrame myFrame = new JFrame();

        //Make a background panel
        ImagePanel panel = new ImagePanel("back.jpg");
        panel.setPreferredSize(new Dimension(800, 600));

        //Make buttons
        JButton button1 = new JButton("Button 1");
        JButton button2 = new JButton("Button 2");

        //Add components
        panel.add(button1);
        panel.add(button2);

        myFrame.add(panel);

        //Set window size
        myFrame.setSize(800, 600);

        //Center it
        myFrame.setLocationRelativeTo(null);

        //Make it close normally
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Make it visible (finalization)
        myFrame.setVisible(true);
    }
}
以下是之前的ImagePanel代码:

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {

    private Image image = null;

    public ImagePanel(String filename) {
        this.image = new ImageIcon(filename).getImage();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null);
    }
}
结果如下:

我更新了我的代码,对于我的新类,它与链接页面完全相同。看起来我不需要更改任何内容。我添加了新类,并按照页面建议进行了操作(谢谢),但现在我的按钮在那里,而图像不在那里。还有,这是首选方式的原因吗?@learn.beh哦,不!很抱歉。嗯,我会尝试移动“frame.getContentPane().add(panel,BorderLayout.CENTER);“after the lines”panel.add(newRoundButton);”。如果我没有弄错的话,在添加其他JFrames和JPanel之前,您应该始终将组件添加到JPanel'中。为了回答您的其他问题,我认为这是首选方法,因为如果您创建自定义类,您可以对JPanel进行更多的控制。我将其移动到了该位置。没有更改。没有图像,但显示了按钮。这种方法oes看起来会有更多的控制。如果我让它工作,当然,在创建ImagePanel后尝试添加这行代码:panel.setPreferredSize(新维度(800600));No go.same。我用上面的更改更新了代码,以准确地显示我拥有的内容。