【问题标题】:Java: JPanel background not scalingJava:JPanel 背景不缩放
【发布时间】:2013-11-08 01:17:36
【问题描述】:

我正在尝试在 java 中将图像绘制到 JPanel 中,但我已经完成了,很好。我现在的问题是我正在尝试使其缩放到窗口的全尺寸,但它没有这样做。我尝试了一些方法,它们要么使图像消失,要么根本没有图形变化。

我目前正在使用的代码:

class ImagePanel extends JPanel {
    private static final long serialVersionUID = 1L;

    private Image img;

    public ImagePanel(String img) {
        this(new ImageIcon(img).getImage());
    }

    public ImagePanel(Image img) {
        this.img = img;
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
    }

    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, null);
    }
}

完整课程:http://pastebin.com/CpcBt2j8

我尝试在img = img.getScaledInstance(440, 440, Image.SCALE_SMOOTH) 处添加代码,但没有任何效果。我还尝试制作一个名为scaledImg 的新图像并将imggetScaledInstance 值设置为该值,这会完全从显示中删除图像。

如何将图像缩放到我想要的完整尺寸?

【问题讨论】:

    标签: java image components


    【解决方案1】:

    动态缩放您使用的图像:

    //g.drawImage(img, 0, 0, null);
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
    

    请参阅Background Panel 了解完整的实现以及平铺功能。

    【讨论】:

      【解决方案2】:

      我猜“最简单”的方法是做类似...

      @Override
      public void paintComponent(Graphics g) {
      
          super.paintComponent(g);
          Image scaled = img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
          g.drawImage(scaled, 0, 0, null);
      
      }
      

      这是低效、昂贵的,并且可能不会产生预期的结果

      首先,看看The Perils of Image.getScaledInstance()

      您还可以查看Java: maintaining aspect ratio of JPanel background image,了解有关保持图像纵横比和缩放以适应与缩放以填充的更多详细信息。

      我还会缓冲结果,这样您就不会在 paintComponent 方法中重复缩放图像,这可能会经常被捕获...

      更新了工作示例

      这对我来说很好......

      import java.awt.BorderLayout;
      import java.awt.Dimension;
      import java.awt.EventQueue;
      import java.awt.Graphics;
      import java.awt.HeadlessException;
      import java.awt.Image;
      import java.io.File;
      import java.io.IOException;
      import javax.imageio.ImageIO;
      import javax.swing.ImageIcon;
      import javax.swing.JFrame;
      import javax.swing.JPanel;
      import javax.swing.UIManager;
      import javax.swing.UnsupportedLookAndFeelException;
      
      public class TestImagePane {
      
          public static void main(String[] args) {
              new TestImagePane();
          }
      
          public TestImagePane() {
              EventQueue.invokeLater(new Runnable() {
                  @Override
                  public void run() {
                      try {
                          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                      }
      
                      try {
                          Image img = null;
                          img = ImageIO.read(new File("/path/to/image"));
      
                          JFrame frame = new JFrame("Testing");
                          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                          frame.setLayout(new BorderLayout());
                          frame.add(new ImagePanel(img));
                          frame.pack();
                          frame.setLocationRelativeTo(null);
                          frame.setVisible(true);
                      } catch (IOException | HeadlessException exp) {
                          exp.printStackTrace();
                      }
                  }
              });
          }
      
          class ImagePanel extends JPanel {
      
              private static final long serialVersionUID = 1L;
      
              private Image img;
              private Image scaled;
      
              public ImagePanel(String img) {
                  this(new ImageIcon(img).getImage());
              }
      
              public ImagePanel(Image img) {
                  this.img = img;
              }
      
              @Override
              public void invalidate() {
                  super.invalidate();
                  int width = getWidth();
                  int height = getHeight();
      
                  if (width > 0 && height > 0) {
                      scaled = img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
                  }
              }
      
              @Override
              public Dimension getPreferredSize() {
                  return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(this), img.getHeight(this));
              }
      
              @Override
              public void paintComponent(Graphics g) {
                  super.paintComponent(g);
                  g.drawImage(scaled, 0, 0, null);
              }
          }
      
      }
      

      【讨论】:

      • 这根本不会产生结果,正如我所说的,我已经尝试过了。图形被完全删除。
      • 你说的“图形被完全删除”是什么意思?除了你没有打电话给super.paintComponent
      • 对不起,我没有放下我的意思。我的意思是,绘制的图像已完全从视图中移除,它只是离开了面板。
      猜你喜欢
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2016-07-24
      • 2012-06-27
      • 2017-07-06
      相关资源
      最近更新 更多