【问题标题】:how do i make visible other component visible while setting background image of frame?如何在设置框架的背景图像时使其他组件可见?
【发布时间】:2015-09-20 21:45:26
【问题描述】:

我在运行程序时设置框架的背景图像,我的其他组件是不可见的,只有图像在框架中可见

class ImagePanel extends JComponent {
private Image image;
public ImagePanel(Image image) {
    this.image = image;
}
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);
}

在主类中我调用上面的类如下所示:

BufferedImage myImage = ImageIO.read(new File("cal.jpg"));
frame.setContentPane(new ImagePanel(myImage));

【问题讨论】:

    标签: java swing bufferedimage paintcomponent


    【解决方案1】:

    你有这个代码:

    BufferedImage myImage = ImageIO.read(new File("cal.jpg"));
    frame.setContentPane(new ImagePanel(myImage));
    

    但您似乎正在创建 ImagePanel 实例内联,并且似乎没有向此 ImagePanel 实例添加任何组件,因此您没有看到任何组件我并不感到惊讶.您似乎也没有在 ImagePanel 构造函数中添加任何组件。

    考虑在其构造函数中或在使用它的类中向 ImagePanel 类添加组件,创建一个 ImagePanel 实例,将其分配给一个变量,向其中添加组件,然后然后将其放入JFrame 的 contentPane。

    建议:

    • 考虑将您的图像作为 Jar 资源而不是作为文件,因为您可能会在某个时候对类进行 Jar,如果您继续使用 File,则可能无法访问您的图像。
    • 确保为您的 ImagePanel 提供一个不错的布局管理器。我相信 JComponents 默认使用 null 布局,这是您不想使用的。

    例如,这对我有用:

    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.*;
    
    public class TestImagePanel {
        private static void createAndShowGui() {
            String resource = "/imgFolder/PlanetEarth.jpg";
            Image image = null;
            try {
                image = ImageIO.read(TestImagePanel.class.getResource(resource));
            } catch (IOException e) {
                e.printStackTrace();
                System.exit(-1);
            }
            ImagePanel mainPanel = new ImagePanel(image);
            mainPanel.setLayout(new FlowLayout());
            mainPanel.add(new JButton("Fubars Rule!"));
    
            JFrame frame = new JFrame("TestImagePanel");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGui();
                }
            });
        }
    }
    
    @SuppressWarnings("serial")
    class ImagePanel extends JComponent {
        private Image image;
    
        public ImagePanel(Image image) {
            this.image = image;
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }
    
        @Override
        public Dimension getPreferredSize() {
            Dimension superSize = super.getPreferredSize();
            int w = image == null ? superSize.width : Math.max(superSize.width, image.getWidth(null));
            int h = image == null ? superSize.height : Math.max(superSize.height, image.getHeight(null));
            Dimension d = new Dimension(w, h);
    
            return d;
        }
    }
    

    并展示了这个 GUI:

    【讨论】:

    • 实际上我在 gui 中工作,我在框架中添加了标签,但是当我添加背景图像时它们没有显示
    • @HamzaShahid:感谢您回复我们。那么您的代码可能有问题,但这里没有显示您的问题。考虑创建并发布您的minimal reproducible example(请查看链接)。
    • 实际上我的代码运行良好,在我为背景图像添加代码之前显示结果完美,之后我的其他组件没有显示
    • 背景图片有特定的布局吗?
    • @HamzaShahid:布局与此无关。问题再次是您在未显示的代码中存在错误。您当前的代码再次显示您使用 ImagePanel 而不向其中添加任何组件,因此基于该代码,这就是您的问题。如果你已经解决了这个问题,那么就会发生其他事情,你需要再次发布一个小的 minimal reproducible example 演示程序。
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多