当前位置: 首页 > 面试题库 >

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

方永贞
2023-03-14
问题内容

背景:-我需要使用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                   
}

问题答案:

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

您可以将框架的可调整大小属性设置为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);
            }
        });
    }
}


 类似资料:
  • 我已经将一个图像读入一个JLabel,并将该图像缩放到JLabel的大小,如下所示: 我使用提供的GroupLayout并将水平轴和垂直轴设置为“自动调整大小”(通过设计视图),这样每当我更改窗口大小时,JLabel的大小就会自动调整为JFrame的大小。 现在我想调整图像的大小和JLabel的大小,这里开始麻烦了。我添加了一个事件处理程序,它响应JFrame的大小调整,如下所示: 另外,如果我想

  • 问题内容: 我正在尝试动态缩放文本,以将其放置在尺寸不同但已知的图像上。文本将用作水印。有什么方法可以根据图像尺寸缩放文本?我并不需要文字占据整个表面区域,而只是要使其足够可见即可,以使其易于识别且难以删除。我正在使用Python Imaging Library版本1.1.7。在Linux上。 我希望能够设置文本大小与图像大小的比率,比如说1/10大小。 我一直在寻找字体大小属性来更改大小,但是我

  • 问题内容: 我想拍摄一张图像并更改图像的比例,虽然它是一个numpy数组。 例如,我有一个可口可乐瓶的图像: bottle-1 转换为一个numpy的形状数组,我想调整其大小以表示第二个图像的大小: bottle-2 形状为。 如何在保持原始图像的同时将图像尺寸更改为特定形状?其他答案建议每隔一行或第三行剥离,但是我想要做的基本上是像通过图像编辑器(但在python代码中)那样收缩图像。是否有任何

  • 我试图创建一个GUI如下图所示 然而,当我运行我的文件时,图像的大小仍然保持原来的大小 我怎样才能缩小图像的大小,这样我就可以在旁边添加文本了?

  • 对不起,我不能上传图片

  • 问题内容: 我需要根据用于调整容器大小的缩放因子来调整多个JLabel的字体大小。为此,我将每个JLabel的字体设置为null,以便它们采用容器的字体。它有效,但也会产生奇怪的结果。 具体来说,文本似乎“滞后”在容器后面,有时甚至被截断。我想避免这种行为。任何想法如何? 模拟行为的示例代码: 图片:http : //i.stack.imgur.com/tZLOO.png 谢谢, -s 问题答案: