程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了图像未在 Java Swing 中添加为背景大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决图像未在 Java Swing 中添加为背景?

开发过程中遇到图像未在 Java Swing 中添加为背景的问题如何解决?下面主要结合日常开发的经验,给出你关于图像未在 Java Swing 中添加为背景的解决方法建议,希望对你解决图像未在 Java Swing 中添加为背景有所启发或帮助;

我有这个代码,我正在尝试在背景中添加图片显示作为墙纸。我用这个 stackoverflow post 作为参,但它没有用。我的图像被添加到面板中,但不是作为背景。可能是什么问题?

旁注,.setLOCATIOn() 也不会更新按钮的位置。提前致谢!

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import net.miginfocom.swing.MigLayout;
import java.awt.image.bufferedImage;
import java.io.IOException;
import java.sql.*;
  
  
class APP extends JPanel
{
    JFrame frame = new JFrame();
    JPanel panel;
  
    class ImagePanel extends JComponent {
        Image image;
        public ImagePanel(Image imagE) {
            this.image = image;
        }
        @OverrIDe
        protected voID paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image,100,25,this);
        }
    }
  
    public APP(){
  
        JLabel picLabel = new JLabel();
  
  
        try {
            BufferedImage image = ImageIO.read(getClass().getresource("login_bg.jpg"));
            this.setContentPane(new ImagePanel(imagE));
            picLabel = new JLabel(new ImageIcon(imagE));
            //picLabel.setBounds(100,843,568);
        } catch (IOException E){
            e.printstacktrace();
        }
 
  
        panel = new JPanel();                    // used to do padding like in HTML
        panel.setborder(borderFactory.createEmptyborder(50,350,300,350));
        panel.setLayout(null));
        panel.add(picLabel);
   
   
        frame.add(panel,borderLayout.CENTER);
        frame.getContentPane();
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.settitle("Drone Delivery");
        frame.pack();
        frame.setVisible(true);
   
    }
   
}

解决方法

仍然不是 MRE,但要好一点,所以我会提出更多建议:

  1. 没有调用代码的 main() 方法
  2. 无需向面板添加 5 个组件。一个组件将演示问题。
  3. 实际上,您仍然根本不需要面板,因为您还没有创建带有背景图像的 JFrame。

代码的基本问题:

  1. 您的逻辑正在尝试用您绘制图像的自定义类替换默认内容窗格。正如我在上面的“提示”中所建议的,如果您想要背景图像,那么 a) 组件应该扩展 JPanel,并且 b) 您需要在类的构造函数中将布局管理器设置为 BorderLayouut。现在您将能够向面板添加子组件。

  2. 您有两个 JFrame 实例。您的类扩展 JFrame,并在构造函数中创建 JFrame 的新实例。不要扩展 JFrame。

  3. 您的 ImagePanel 需要添加到在构造函数中创建的“框架”中。

所以您的解决方案的第一部分是简单地让这个逻辑工作。这就是您所需要的 JFrame,其中您的 ImagePanel 添加为框架的内容窗格。

然后进入下一步。

我的图像被添加到面板中,但不是作为背景

实际上,由于上​​述原因,它并未添加为背景。您看到的是包含 ImageIcon 的“JLabel”。去掉标签。

//frame.getContentPane().setLayout(new FlowLayout());

上面的语句是不需要的。如果您按照我上面的提示操作,您应该已经在类的构造函数中设置了“ImagePanel”的布局管理器。

frame.add(panel,BorderLayout.CENTER);

尝试一下,看看会发生什么。您的面板将覆盖图像。

现在尝试:

    frame.add(panel,BorderLayout.PAGE_START);

您应该会看到框架顶部的组件。

您还可以添加:

panel.setOpaque(false);

您将在组件下方看到图像。

,

我建议您使用 JLabel。这个组件可以有一个布局和组件,以及一个背景图片(通过使setIcon(ImageIcon icon))。

,

你的代码有很多问题,还有很多坏习惯。

  1. setLOCATIOn() 仅在禁用 Layoutmanager 后才具有永久效果。 使用 panel.add(create_btn);,您需要一个带有 LayoutManager 的面板,该面板不会对组件进行任何布局。我不知道 MigLayout,但正如 LayoutManagers 通常所做的那样,他们布置组件。因此,每当 MigLayout 进行任何更改来布局面板的组件时,之前通过 setSize/setLOCATIOn/setBounds 等进行的任何手动更改都会丢失。

  2. 你重新使用变量“create_btn”,你实际上没有将第一个添加到任何面板,因此它不会出现。最佳做法:

  • 不要重复使用变量
  • 使用final在字段中初始化尽可能多的组件。这不包括任何初始化引发异常的组件;但是,它们仍然应该尽快初始化并在可能的情况下完成
  1. 看起来您正在混淆类 APP 和您创建的独立框架 (frame = new JFrame();)。您将图像添加到 APP,但您从不显示框架 APP。相反,在内部,您创建了第二个“框架”,不要向其添加任何图片/标签,然后显示它。所以难怪图像不会显示,因为它在永远不会显示的框架“APP”中。

/更新: 如果您想自己定位所有项目,只需添加行 panel.setLayout(null);

大佬总结

以上是大佬教程为你收集整理的图像未在 Java Swing 中添加为背景全部内容,希望文章能够帮你解决图像未在 Java Swing 中添加为背景所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:Java