简体   繁体   English

如何制作与面板相同尺寸的图像?

[英]How can I make an image the same size as the panel?

I created a simple frame program that includes a image. 我创建了一个包含图像的简单框架程序。 But the image don't have the same size as the frame. 但是图像的大小与框架的大小不同。 If i enlarge the frame the image size stays the same? 如果我放大框架,图像尺寸保持不变吗?

How can i make the image the same size as the frame? 如何使图像尺寸与框架相同?

Here is my current code: 这是我当前的代码:

    JPanel panel1 = new JPanel();
    ImageIcon image1 = new ImageIcon("C:\\Users\\Dark Mangetsu\\Downloads\\Ceng102_Lab10.1\\image\\flower.jpg");
    JLabel label1 = new JLabel(image1);
    panel1.add(label1);
    Color color1 = new Color (200, 0 ,100);
    panel1.setBorder(BorderFactory.createLineBorder(color1, 3));
    JFrame f = new JFrame("Frame");
    f.setLayout(new BorderLayout(5,5));
    f.add((panel1),BorderLayout.WEST);
    f.setSize(320,200);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

You can paint the image instead of using a label. 您可以绘制图像而不是使用标签。

ImageIcon icon = new ImageIcon("C:\\Users\\Dark Mangetsu\\Downloads\\Ceng102_Lab10.1\\image\\flower.jpg");
Image image = icon.getImage();
JPanel panel1 = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, getWidth(), getHeight());
    }
};

Also not sure, but I think you may want to add the panel to the CENTER and not the west (if you want the image to be centered in the frame). 也不确定,但是我想您可能想将面板添加到CENTER而不是向西添加(如果您希望图像在框架中居中)。

Also not, if you want a preferredSize for the panel, you will have to override the getPreferredSize() of the panel also. 同样不是,如果您想要面板的getPreferredSize() ,则还必须覆盖面板的getPreferredSize()

JPanel panel1 = new JPanel() {
    ...
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(320, 200);
    }
};

Then you can just pack() the frame, which is preferred, instead of setting the size 然后,您可以只pack()框架,这是首选,而不是设置大小

f.pack();
//f.setSize(320, 200);

在此处输入图片说明在此处输入图片说明在此处输入图片说明

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestBackgroundResize {
    public TestBackgroundResize() {
        JFrame frame = new JFrame();
        frame.setContentPane(createBackgroundPanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel createBackgroundPanel() {
        return new JPanel() {
            BufferedImage image;
            {
                try {
                    image = ImageIO.read(getClass().getResource("/marioblobs/mario.png"));
                } catch (IOException ex) {
                    Logger.getLogger(TestBackgroundResize.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
            }
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(320, 200);
            }
        };
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new TestBackgroundResize();
            }
        });
    }
}

I think the code is missing call to pack() method. 我认为代码缺少对pack()方法的调用。

Here is a sample code: 这是一个示例代码:

public class ImageToPanel {
    public static void main(String[] args) {
        ImageToPanel itp = new ImageToPanel();
        itp.go();
    }

    private void go() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() { createAndShowGUI(); }
        });
    }

    private void createAndShowGUI() {
        JFrame f =new JFrame();           
        f.setLayout(new BorderLayout());
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setPreferredSize(new Dimension(640,400));

        JLabel label = new JLabel( new ImageIcon("wallpaper.jpg") );
        f.add(label, BorderLayout.CENTER);

        JButton button = new JButton("Quit");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
               System.exit(0);
            }
        });       
        f.add(button, BorderLayout.SOUTH);

        f.pack();
        f.setVisible(true);
    }
}

SCREENSHOT 屏幕截图

In the screenshot below, a 1920x1200 wallpaper is constrained seamlessly in a 640x400 frame. 在下面的屏幕截图中,将1920x1200墙纸无缝限制在640x400帧中。

受640x400 JFrame限制的1920x1200图像

Tested on 经过测试

  • Windows 7 Windows 7的
  • Java 7 Java 7

EDIT: 编辑:

ImageIcon image1 = new ImageIcon("wallpaper.jpg");
JLabel label1 = new JLabel(image1);

Color color1 = new Color (200, 0 ,100);
label1.setBorder(BorderFactory.createLineBorder(color1, 3));

JFrame f = new JFrame("Frame");
f.setLayout(new BorderLayout(5,5));
f.add(label1,BorderLayout.WEST);
f.setSize(320,200);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Before resize 调整大小之前

在此处输入图片说明

After resize 调整大小后

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM