Как изменить размеры изображений внутри приложения при изменении размера окна приложения?

Когда я максимизирую свое приложение, изображения внутри JPanel неизменить размер с этим. Как я могу настроить JPanel и его содержимое, когда окно развернуто?

РЕДАКТИРОВАТЬ: я использую BufferedImage

 Roman C13 окт. 2012 г., 22:20
Хотите увеличить?
 MadProgrammer13 окт. 2012 г., 22:21
Вы хотите знать, как изменить размер изображения или узнать, когда изменить размер изображения?

Ответы на вопрос(2)

Один грубый способ ..

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.draw(image,0,0,getWidth(),getHeight(),this);
    // ..

Хотите масштабировать, чтобы заполнить или масштабировать, чтобы соответствовать области или неТебя волнует соотношение сторон ??

Разница между масштабом, чтобы заполнить и масштаб, чтобы соответствовать

 

Этот пример будет реагировать на изменения размера кадра и масштабировать изображение в режиме реального времени.

public class TestScaling {

    public static void main(String[] args) {
        new TestScaling();
    }

    public TestScaling() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ScalingPane());
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class ScalingPane extends javax.swing.JPanel {

        private BufferedImage image;

        public ScalingPane() {
            try {
                image = ImageIO.read(getClass().getResource("/AtDesk.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }    
            setBackground(Color.red);
        }

        public double getScaleFactor(int iMasterSize, int iTargetSize) {    
            double dScale = 1;
            dScale = (double) iTargetSize / (double) iMasterSize;

            return dScale;    
        }

        public double getScaleFactorToFit(Dimension original, Dimension toFit) {    
            double dScale = 1d;

            if (original != null && toFit != null) {    
                double dScaleWidth = getScaleFactor(original.width, toFit.width);
                double dScaleHeight = getScaleFactor(original.height, toFit.height);

                dScale = Math.min(dScaleHeight, dScaleWidth);
            }    
            return dScale;
        }

        public double getScaleFactorToFill(Dimension masterSize, Dimension targetSize) {
            double dScaleWidth = getScaleFactor(masterSize.width, targetSize.width);
            double dScaleHeight = getScaleFactor(masterSize.height, targetSize.height);

            double dScale = Math.max(dScaleHeight, dScaleWidth);

            return dScale;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            double scaleFactor = Math.min(1d, getScaleFactorToFit(new Dimension(image.getWidth(), image.getHeight()), getSize()));
//            double scaleFactor = Math.min(1d, getScaleFactorToFill(new Dimension(image.getWidth(), image.getHeight()), getSize()));

            int scaleWidth = (int) Math.round(image.getWidth() * scaleFactor);
            int scaleHeight = (int) Math.round(image.getHeight() * scaleFactor);

            Image scaled = image.getScaledInstance(scaleWidth, scaleHeight, Image.SCALE_SMOOTH);

            int width = getWidth() - 1;
            int height = getHeight() - 1;

            int x = (width - scaled.getWidth(this)) / 2;
            int y = (height - scaled.getHeight(this)) / 2;

            g.drawImage(scaled, x, y, this);
        }
    }
}

Лучшим решением было бы иметь некоторый фоновый поток, который мог бы реагировать на изменения в размере компонента и масштабировать исходное изображение на заднем плане, обеспечивая низкое качество и высококачественный масштаб.

Следует также отметить, чтоImage.getScaledInstance не самый быстрый и не самый качественный алгоритм масштабирования. Взгляни наОпасности Image.getScaledInstance для дополнительной информации.

Вы также можете найти следующие интересные

Java: поддержание пропорций фонового изображения JPanel

 Jake Sumrican15 окт. 2012 г., 12:47
Я пытаюсь масштабировать, чтобы заполнить, и спасибо за ответ!

Ваш ответ на вопрос