将背景图像加载到 JFrame 中的 JPanel 时出错

2023-12-07

我有一个JFrame我想用一个完全占据它JPanel并将背景图像放入JPanel.

Code:

public class InicioSesion extends javax.swing.JFrame{
private Image imagenFondo;
private URL fondo;

public InicioSesion(){
    initComponents();
    try{
        fondo = this.getClass().getResource("fondo.jpg");
        imagenFondo = ImageIO.read(fondo);
    }catch(IOException ex){
        ex.printStackTrace();
        System.out.print("Image dont load"); //Dont load the message.
    }

    Container c = getContentPane();
    c.add(PanelFondo);
}

public JPanel panelFondo = new JPanel(){
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(imagenFondo, 0, 0, getWidth(), getHeight(), this);
    }
};

为什么图片加载不出来?我的代码有什么解决方案吗?

enter image description here


你的问题在这里:

initComponents();

您可能会在此方法中将所有组件添加到 GUI,很可能使用 GroupLayout 或其他用户不友好的布局管理器,然后添加panelFondo添加所有组件后的 JPanel。

如果您希望 GUI 显示背景图像,则需要将组件添加到图像绘制 JPanel,并且如果在图像抽屉顶部添加任何 JPanel,则它们需要是透明的 (setOpaque(false)`),因此背景图像显示出来。


我猜您正在使用 GUI 构建器来创建 GUI 布局并帮助您向 GUI 添加组件。我自己避免使用它们,并且更喜欢使用布局管理器(从不为空布局)手动创建 GUI。如果您绝对必须使用 GUI 构建器,则让该构建器为您创建一个 JPanel,而不是 JFrame,然后覆盖此 JPanel 的 PaintComponent,在其中绘制图像。否则,您最好像我一样学习 Swing 布局管理器并手动创建 GUI。

您的窗口似乎是一个登录窗口,如果是这样,如果这是我的程序,我什至不会使用 JFrame 而是使用modalJDialog 来显示它,因为以这种方式控制程序流程会更容易。


使用 GridBagLayout 和太多“幻数”的概念证明程序:

enter image description here

import java.awt.*;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class LoginPanel extends JPanel {
    public static final String TITLE = "INICIO DE SESIÓN";
    public static final String IMG_PATH = "https://upload.wikimedia.org/wikipedia/"
            + "commons/thumb/6/69/MarsSunset.jpg/779px-MarsSunset.jpg";
    private JTextField usuarioField = new JTextField(20);
    private JPasswordField passwordField = new JPasswordField(20);
    private BufferedImage backgroundImg = null;

    public LoginPanel(BufferedImage img) {
        this.backgroundImg = img;
        JCheckBox showPasswordChkBx = new JCheckBox("Show Password");
        showPasswordChkBx.setOpaque(false);
        showPasswordChkBx.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    passwordField.setEchoChar((char) 0);
                } else {
                    passwordField.setEchoChar('*');
                }
            }
        });

        JButton accederBtn = new JButton("Acceder");
        accederBtn.addActionListener(e -> {
            Window win = SwingUtilities.getWindowAncestor(LoginPanel.this);
            win.dispose();
        });

        setForeground(Color.BLACK);

        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        int row = 0;

        gbc.gridx = 0;
        gbc.gridy = row;
        gbc.gridwidth = 2;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        int ins = 12;
        gbc.insets = new Insets(ins, ins, ins, ins);
        gbc.anchor = GridBagConstraints.CENTER;

        JLabel titleLabel = new JLabel(TITLE);
        titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD, 24f));
        add(titleLabel, gbc);

        row++;
        gbc.gridx = 0;
        gbc.gridy = row;
        gbc.gridwidth = 1;
        gbc.anchor = GridBagConstraints.LINE_START;
        add(new JLabel("Usuario:"), gbc);

        gbc.gridx = 1;
        add(usuarioField, gbc);

        row++;
        gbc.gridx = 0;
        gbc.gridy = row;
        gbc.insets = new Insets(ins, ins, 0, ins);
        add(new JLabel("Password:"), gbc);

        gbc.gridx = 1;
        add(passwordField, gbc);

        row++;
        gbc.gridx = 0;
        gbc.gridy = row;
        gbc.insets = new Insets(0, ins, ins, ins);
        add(new JLabel(""), gbc);

        gbc.gridx = 1;
        add(showPasswordChkBx, gbc);

        row++;
        gbc.gridx = 0;
        gbc.gridy = row;
        gbc.insets = new Insets(ins, ins, ins, ins);
        add(new JLabel(""), gbc);

        gbc.gridx = 1;
        add(accederBtn, gbc);

    }

    public String getUsuario() {
        return usuarioField.getText();
    }

    public char[] getPassword() {
        return passwordField.getPassword();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (backgroundImg != null) {
            g.drawImage(backgroundImg, 0, 0, getWidth(), getHeight(), this);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension superSize = super.getPreferredSize();
        int width = superSize.width;
        int height = superSize.height;
        if (backgroundImg != null) {
            width = Math.max(width, backgroundImg.getWidth());
            height = Math.max(height, backgroundImg.getHeight());
        }
        return new Dimension(width, height);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        BufferedImage img = null;
        try {
            URL imgUrl = new URL(IMG_PATH);
            img = ImageIO.read(imgUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }

        LoginPanel mainPanel = new LoginPanel(img);
        JDialog dialog = new JDialog((JFrame) null, LoginPanel.TITLE, ModalityType.APPLICATION_MODAL);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.add(mainPanel);
        dialog.pack();
        dialog.setLocationByPlatform(true);
        dialog.setVisible(true);

        System.out.println("User Name: " + mainPanel.getUsuario());
        System.out.println("Password: " + new String(mainPanel.getPassword()));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将背景图像加载到 JFrame 中的 JPanel 时出错 的相关文章

  • 通过 html tidy 提供渲染 jsp 页面

    我有一个在 Glassfish 上运行的 Java 项目 它会呈现一些难看的 HTML 这是使用各种内部和外部 JSP 库的副作用 我想设置某种渲染后过滤器 通过 HTMLTidy 提供最终的 HTML 这样源代码就很好且整洁 有助于调试
  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • 如何在Spring Boot中初始化一次MongoClient并使用它的方法?

    您好 我正在尝试导出MongoClient在 Spring Boot 中成功连接后 我尝试在其他文件中使用它 这样我就不必每次需要在 MongoDB 数据库中进行更改时都调用该连接 连接非常简单 但目标是将应用程序连接到我的数据库一次 然后
  • Java“空白最终字段可能尚未初始化”方法中抛出异常

    我有一些代码 例如 final int var1 if isSomethingTrue var1 123 else throwErrorMethod int var2 var1 throwErrorMethod 的定义如下 private
  • 我们可以在不使用 main 方法、静态变量和静态方法的情况下在控制台上打印 java 消息吗?

    public class Test param args 1st way public static void main String args TODO Auto generated method stub System out prin
  • Glassfish:在部署期间修改 EAR 的部署描述符

    经过几天的搜索 尝试和摇头 我将这个问题发布到 SO 尽管它seems已经得到答复 这是场景 我有一个 EAR 应用程序 目前 包含一个 WAR 和一个 EJB 模块 EJB 模块使用 JPA persistence xml 并且一些无状态
  • ResultSet:通过索引检索列值与通过标签检索

    使用 JDBC 时 我经常遇到这样的结构 ResultSet rs ps executeQuery while rs next int id rs getInt 1 Some other actions 我问自己 以及代码作者 为什么不使用
  • scipy.misc.imshow RuntimeError('无法执行图像视图')

    我正在测试scipy misc imshow https docs scipy org doc scipy 0 15 1 reference generated scipy misc imshow html我得到了运行时错误 无法执行图像查
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • 如何使用 Selenium 中的索引切换到窗口

    由于selenium不提供切换到窗口 多个窗口 的方法 但我想使用index html自定义方法来切换到不同的窗口 但下面的代码没有按预期工作 请建议以下方法的最佳实施 public void switchToWindowIndex int
  • 反应式 Spring Webflux REST 控制器内部重定向

    我正在为 spring 反应项目创建简单的控制器服务器 在设置重定向到另一个位置时 我在调用时发现错误http localhost 8080 There was an unexpected error type Internal Serve
  • selenium webdriver 中的多个程序执行不起作用

    Selenium WebDriver 中的多个程序执行不起作用 我编写了 1 个 testNG xml 文件和 2 个 java 类 我尝试从 xml 文件运行这两个 java 类 但这不起作用 XML代码
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • 如何列出hadoop hdfs中目录及其子目录中的所有文件

    我在 hdfs 中有一个文件夹 其中有两个子文件夹 每个子文件夹大约有 30 个子文件夹 最后 每个子文件夹都包含 xml 文件 我想列出所有 xml 文件 仅给出主文件夹的路径 在本地我可以这样做apache commons io 的 h
  • 在 REST Web 服务中接受逗号分隔值

    我正在尝试接收 REST URI 中以逗号分隔值形式的字符串列表 示例 http localhost 8080 com vogella jersey first rest todo test 1 abc test 其中 abc 和 test
  • Spring Transactional 减慢了整个过程

    我正在尝试分析我有两堂课的情况 其中一个类是 ProcessImpl 它是起点并在内部调用其他子事务 我不知道出了什么问题 processImpl正在导入一些东西并将相关数据写入数据库 Specs Spring orm版本 3 2 18 发
  • AndroidAnnotations 和 Dagger

    我正在尝试使用 Dagger 注入 Android 带注释的 Activity java lang IllegalArgumentException No inject registered for members com app serv
  • 使用正则表达式匹配阿拉伯文文本

    我试图使用正则表达式仅匹配阿拉伯语文本 但出现异常 这是我的代码 txt matches P Arabic 这是例外情况 线程 main 中的异常 java util regex PatternSyntaxException 索引 9 附近

随机推荐

  • 使用正则表达式以任意顺序排列多个单词[重复]

    这个问题在这里已经有答案了 正如标题所说 我需要在句子中找到两个特定的单词 但它们可以是任何顺序和任何大小写 我该如何使用正则表达式来做到这一点 例如 我需要提取单词test and long从下面的句子中是否该词test首先出现或long
  • Linq2SQL:更新对象未在数据上下文中创建

    通常 当您在 linq2sql 中更新对象时 您会从数据上下文中获取该对象并使用相同的数据上下文来保存该对象 对吧 更新尚未由用于执行保存操作的数据上下文检索的对象的最佳方法是什么 即我使用Florinefx在flex和asp net之间传
  • 错误代码 1005,SQL 状态 HY000:无法创建表 errno:150

    我正在尝试创建一个表 但是当我的 netbeans 出错数据库的第一个表时 脚本就会失败 如何解决这个问题 CREATE TABLE filmy Film Id int NOT NULL Nazwa varchar 250 Adres va
  • HttpModule 仅在特定 MVC 路由上

    我有一个习惯IHttpModule我只想在特定路线上工作 例如 http example com HandleAzureTask 我希望这个模块只能在 HandleAzureTask route 由于这不是控制器 我无法真正设置 Autho
  • UINavigationBar 旋转和自动布局

    关于通过将 UINavigationBar 插入场景来设计自己的视图控制器 我发现了许多关于旋转设备时框架高度如何不改变的问题的参考 这与 Apple 在其导航控制器中使用 UINavigationBar 的方式形成鲜明对比 其中导航栏的高
  • 如何在 Easy Slider 1.7 中重新启动滑动动画

    我有一个关于 jQuery Easy Slider 1 7 的问题http cssglobe com post 5780 easy slider 17 numeric navigation jquery slider带有数字导航 当我使用滑
  • R线性回归公式中的大写字母“I”是什么意思?

    我一直无法找到这个问题的答案 主要是因为谷歌搜索带有独立字母 如 I 的任何内容都会导致问题 我 在这样的模型中做什么 data rock lm area I peri mean peri data rock 考虑到以下方法不起作用 lm
  • 用于匹配包含点的整个单词的正则表达式

    在下面的句子中 我下午 5 点就醒了 今天 我想匹配5 p m 该模式的工作原理 5 p m 但我希望它只匹配整个单词 所以下午 5 点不会匹配 所以我使用了这个模式 b5 p m b 但由于点的原因 这不起作用 解决这个问题最简单的正则表
  • 如何从git暂存区删除文件?

    我对本地存储库中的一些文件进行了更改 然后我做了git add A我认为向暂存区域添加了太多文件 如何删除暂存区中的所有文件 完成后 我将手动执行git add filename 您可以使用以下命令从索引中取消暂存文件 git reset
  • 如何比较android中的字符串大于

    我想知道是否有一种方法可以将android中的字符串与大于或 gt 进行比较 可以说我有这个 String numbers number getText toString if numbers equals 9 output setText
  • Google Oauth 给出代码兑换错误

    您好 我正在开发一个用户通过谷歌帐户登录的项目 本地主机 我已经实现了谷歌注册 当我从我的帐户登录时 我收到以下错误 TokenError Code was already redeemed at Strategy OAuth2Strate
  • 如何将参数传递给导航控制器内的弹出视图控制器

    我有一个带有分割视图的 iPad 应用程序 并且详细视图控制器的导航栏中有一个右栏按钮 该按钮调用由导航控制器和两个表视图组成的弹出窗口 如下图所示 由于故事板在图片上很小 我添加了一些解释 白色控制器是detailViewControll
  • MySQL 更新数组中的特定 JSON 对象

    我正在努力寻找一种方法来更新 MySQL 中 JSON 类型字段中数组中的特定 JSON 对象 假设我有以下对象 SET j cat meow dog woof parrot volume quiet says hello volume l
  • Google折线图(交互式)api - 我们如何在指定区域填充不同的背景颜色

    我需要在指定区域的谷歌折线图中水平填充背景颜色 我已经查看了所有 api 但没有得到解决方案 谷歌图像图表 我认为它已被弃用 有一些属性 但我正在使用交互式图表 我只是附上我真正想要的图像 Please help 您可以通过使用组合图而不是
  • SQLiteException:靠近“引用”:语法错误

    String CREATE ASSIGNMENTS TABLE create table ASSIGNMENTS TITLE text not null DESCRIPTION text not null REFERENCES text n
  • nodejs http模块server.listen(),如果我们不定义端口号,默认端口是多少

    server listen port hostname backlog callback 这些参数都是可选的 所以我只是打电话 server listen 服务器似乎已启动并运行 but http 127 0 0 1 or http 127
  • 如何覆盖视图布局声明

    在 asp net MVC 3 中 有没有办法从控制器或操作过滤器覆盖视图中设置的布局声明 Layout Views Shared Layout cshtml 我尝试过重写 OnResultExecuted 或 OnResultExecut
  • 字符串中的短语搜索,制作正确的正则表达式

    我会直接开始 这就是我所拥有的 var SResults function ActivateSearch s SResults for var key in Products if Products key n search new Reg
  • 点击此 Google 翻译按钮不起作用?

    我正在创建一个 Tampermonkey 用户脚本 它会自动单击 Google 翻译网站上的 星号 按钮并保存我的搜索 以便我以后可以查看它们并进行排练 This is the button that I am targeting 这是我到
  • 将背景图像加载到 JFrame 中的 JPanel 时出错

    我有一个JFrame我想用一个完全占据它JPanel并将背景图像放入JPanel Code public class InicioSesion extends javax swing JFrame private Image imagenF