【问题标题】:JPanel/JButtons disappear after JFrame addition of background imageJFrame 添加背景图像后 JPanel/JButtons 消失
【发布时间】:2015-02-12 17:45:57
【问题描述】:

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

公共类 BackPanel 扩展 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);
        }
    }

【问题讨论】:

    标签: java image layout jframe


    【解决方案1】:

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

    Adding an Image to a JPanel Background

    编码愉快!

    编辑:

    我在 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);
        }
    }
    

    结果如下: http://postimg.org/image/93k3j5f43/

    【讨论】:

    • 我更新了我的代码,对于我的新课程,它与链接页面完全一样。看起来我不需要改变任何东西。我添加了新类,并按照页面的建议进行了操作(谢谢),但现在我的按钮在那里,而图像不在。另外,这是首选方式的原因吗?
    • @learned.beh 哦不!对于那个很抱歉。嗯,我会尝试移动“frame.getContentPane().add(panel, BorderLayout.CENTER);”在“panel.add(newRoundButton);”行之后。如果我没记错的话,在添加其他 JFrame 和 JPanel 之前,您应该始终将组件添加到 JPanel'。要回答您的其他问题,我认为这是首选方式,因为如果您制作自定义类,您可以更好地控制 JPanel。
    • 我把它移到了那个位置。没有变化。没有图像,但显示了按钮。这种方式似乎确实会有更多的控制权。如果我让它工作当然大声笑
    • 尝试在创建 ImagePanel 后添加这行代码:panel.setPreferredSize(new Dimension(800, 600));
    • 不行。相同的。我使用上述更改更新了代码,以向您展示我所拥有的。
    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多