Java: maintaining aspect ratio of JPanel background image

前端 未结 4 2053
伪装坚强ぢ
伪装坚强ぢ 2020-11-21 06:28

I have a JPanel with a painted background image and a layout manager holding other smaller images, all of this inside a JFrame. The background imag

4条回答
  •  野的像风
    2020-11-21 07:06

    Try something like this:

    import java.awt.*;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class SG2B2 {
    
        JFrame frame;
    
        public static void main(String[] args) {
            SG2B2 gui = new SG2B2();
            gui.createUI();
        }
    
        public void createUI() {
            frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            MyDrawPanel drawPanel = new MyDrawPanel();
            frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
            frame.setSize(300, 400);
            frame.setVisible(true);
        }
    
        class MyDrawPanel extends JPanel {
    
            Image image;
            private final String pic = "Logo.jpg";
    
            public MyDrawPanel() {
                image = new ImageIcon(pic).getImage();
                image = scaleImage(image);
            }
    
            @Override
            public void paintComponent(Graphics g) {
                Graphics2D g2 = (Graphics2D) g;
                g2.drawImage(image, 0, 0, this);
            }
    
            private Image scaleImage(Image rawImage) {
                Image scaledImage = null;
                System.out.println("Scaling");
                try {
                    int rawImageWidth = rawImage.getWidth(this);
                    int rawImageHeight = rawImage.getHeight(this);
                    int paneWidth = (int) getWidth();
                    int paneHeight = (int) getHeight();
                    System.out.println("Image W = " + rawImageWidth
                            + ", H = " + rawImageHeight
                            + "; Pane W = " + paneWidth
                            + ", H = " + paneHeight);
                    // preserve the original ratio  
                    float widthRatio = (float) rawImageWidth / (float) paneWidth;
                    float heightRatio = (float) rawImageHeight / (float) paneHeight;
                    int widthFactor = -1;
                    int heightFactor = -1;
                    if ((widthRatio > heightRatio) && (widthRatio > 1.0)) {
                        widthFactor = paneWidth;
                    } else if ((heightRatio > widthRatio) && (heightRatio > 1.0)) {
                        heightFactor = paneHeight;
                    }
                    System.out.println("widthRatio = "
                            + String.format("%.3f", widthRatio)
                            + ", heightRatio = "
                            + String.format("%.3f", heightRatio));
                    System.out.println("widthFactor = " + widthFactor
                            + ", heightFactor = " + heightFactor);
                    if ((widthFactor < 0) && (heightFactor < 0)) {
                        scaledImage = rawImage;
                    } else {
                        scaledImage = rawImage.getScaledInstance(widthFactor, heightFactor,
                                Image.SCALE_SMOOTH);
                        // load the new image, 'getScaledInstance' loads asynchronously  
                        MediaTracker tracker = new MediaTracker(this);
                        tracker.addImage(scaledImage, 0);
                        tracker.waitForID(0);
                    }
                } catch (InterruptedException ie) {
                    System.err.println("load interrupt: " + ie.getMessage());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return (scaledImage);
            }
        }
    }
    

    which will ultimately scale the image to the JPanel's size by using getScaledInstance(int width, int height, ImageObserver io)

提交回复
热议问题