小编典典

如何在Netbeans GUI Builder中根据父JLabel的大小自动缩放图像的大小?

java

背景:-我需要使用Netbeans GUI Builder制作Swing GUI。
第一个子任务是在整个背景中显示图像。

我已经按照教程完成了。我基本上已经制作了一个JFrame,将其布局设置
为GridBagLayout,然后向其中添加了一个透明的(通过取消选中opaque
属性)JPanel。(问题1)

之后,我向JFrame添加了JLabel,删除了其文本并为其添加了图像
。(问题2)

问题:

首先,当我添加JPanel时,它不会显示其调整大小的句柄。我用Google搜索了一下,发现了本教程,在该教程中可以看到,当他们创建JPanel时,它会自动显示其调整大小手柄,可以将其拖动以调整其大小。
但是我的却没有(下面的截图)那么,是否有一些属性或
可以调整的东西,以便我可以调整大小? 因为我的意图是
使用此透明面板在
背景上包含组件(按钮等),所以它应该经过整个屏幕/窗口/ JFrame父级。
在此处输入图片说明

其次,由于我使用的图像具有1024x768的尺寸,因此它看起来比其父组件大得多。 在此处输入图片说明
由于我是菜鸟,所以我不确定是否需要
通过某种方式测量
父图像的像素宽度和像素高度,然后在
诸如Adobe Photoshop之类的程序中将实际图像的尺寸转换为该尺寸来调整背景图像的尺寸。但是我相信必须有一种更实际的方法来
做到这一点。

我希望图像在
最初放置在其父级JLabel上时会根据父级的大小自动调整大小。我怎样才能做到这一点?
请告诉我最简单的方法,最好在GUI Builder中。

我还想确保图像大小,其父级JLabel的大小,JPanel的
大小都将在
以后使用此应用程序更改窗口的大小时,或者是否有一种方法来禁用该窗口的大小时,都能够适应该帧
。窗口完全。


EDIT1 @Braj

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.dev_nna.dbp;


public class JFrameParent extends javax.swing.JFrame {

    /**
     * Creates new form JFrameParent
     */
    public JFrameParent() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new java.awt.GridBagLayout());

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        getContentPane().add(jPanel1, new java.awt.GridBagConstraints());

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/dev_nna/dbp/scheduler/resources/Abstract-white-and-blue-backgrounds.jpg"))); // NOI18N
        jLabel1.setText("jLabel1");
        getContentPane().add(jLabel1, new java.awt.GridBagConstraints());

        pack();
    }// </editor-fold>

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(JFrameParent.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JFrameParent.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JFrameParent.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JFrameParent.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JFrameParent().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration                   
}

阅读 501

收藏
2020-11-26

共1个答案

小编典典

“或者是否有一种方法可以完全禁用窗口的大小。”

您可以将框架的可调整大小属性设置为false。从NetBeans GUI
Builder

从设计视图或导航器窗口中突出显示/选择框架组件。
转到右侧的属性窗口,查找属性resizable并确保未选中
“我还想确保
当我更改
窗口的大小时,图像大小,其父级JLabel的大小,JPanel的大小都将根据框架进行调整”

一种方法是将背景绘制到背景面板上,而不是使用
带有图标的标签。您可以
在此处查看示例。对于GUI Builder,
最简单的方法(无需编辑自动生成的代码
,如果您不知道自己在做什么,我不建议这样做)是使用JPanel表单
而不是JFrame表单。在JPanel表单上绘画,然后可以将该
JPanel表单添加到JFrame表单中。您可以
在此处看到将表单添加
到JPanel表单的简便方法JFrame。

请参阅表演自定义绘画以了解有关绘画的更多信息

也可以看看这个StretchIcon,你可以用一个标签使用。

更新

所以您的JPanel表单类最终将看起来像这样


UPDATE

So your JPanel form class will ultimately look something like this

public class PanelForm extends javax.swing.JPanel {
    private BufferedImage image;

    public PanelForm() {
        try {
            image = ImageIO.read(getClass().getResource("/path/to/image/png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }  
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500, 500);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new PanelForm());     //  <--- add it here
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
2020-11-26