переопределение метода рисования в JApplet

Я работаю над проектом, чтобы содержимое JApplet автоматически масштабировалось до размера, указанного в html. Я понимаю, что это то, для чего были созданы менеджеры компоновки, однако, поскольку мне не разрешено переписывать всю структуру апплетов, я решил попытаться переопределить рисование и просто установить AffineTransform объекта Graphics на версию с соответствующим масштабом. , затем захватите события мыши в верхнем контейнере и уменьшите их масштаб с помощью соответствующего преобразования масштабирования. Я застрял на части рисования в данный момент. При просмотре в веб-браузере масштабированная версия правильно отображается один раз, после чего изображение сжимается до исходного размера. Кроме того, кажется, что метод рисования в JApplet вызывается только один раз. Вот урезанная версия моего кода, которая фокусируется на проблеме. Любая помощь будет оценена по достоинству. Заранее спасибо.

import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

public class Test extends JApplet
{
        public static final int ORIGINAL_APPLET_WIDTH = 1024;
        public static final int ORIGINAL_APPLET_HEIGHT = 800;
        private AffineTransform scalingTransform;
        private AffineTransform inverseScalingTransform;
 @Override
 public void init()
 {
            double xFactor = ((double)(this.getWidth()))/((double)(Test.ORIGINAL_APPLET_WIDTH));
            double yFactor = ((double)(this.getHeight()))/((double)(Test.ORIGINAL_APPLET_HEIGHT));
            this.scalingTransform = new AffineTransform();
            this.inverseScalingTransform = new AffineTransform();
            this.scalingTransform.scale(xFactor,yFactor);
            this.inverseScalingTransform.scale(1D/xFactor,1D/yFactor);
 }
    @Override
    public void paint(Graphics g)
    {
        ((Graphics2D)g).setTransform(Test.this.scalingTransform);
        super.paint(g);
    }
}

person S E    schedule 12.01.2011    source источник
comment
Не совсем та же проблема, но здесь приведен пример сохранения преобразование, используемое во время рисования, и его использование для сопоставления координат мыши с пикселями исходного изображения.   -  person finnw    schedule 12.01.2011


Ответы (1)


После долгих исследований я понял, что проблема в том, что метод рисования JApplet вызывается не очень часто. Вместо этого панель содержимого имеет собственную поверхность для рисования, поэтому мне просто пришлось заменить панель содержимого, чтобы загрузить ее. вот как я это сделал:

@Override
    public void init()
    {
            double xFactor = ((double)(this.getWidth()))/((double)(qt.ORIGINAL_APPLET_WIDTH));
            double yFactor = ((double)(this.getHeight()))/((double)(qt.ORIGINAL_APPLET_HEIGHT));
            this.scalingTransform = new AffineTransform();
            this.inverseScalingTransform = new AffineTransform();
            this.scalingTransform.scale(xFactor,yFactor);
            this.inverseScalingTransform.scale(1D/xFactor,1D/yFactor);
            JPanel drawScale = new JPanel()
            {
                @Override
                public void paint(Graphics g)
                {
                    ((Graphics2D)g).setTransform(Test.this.scalingTransform);
                    super.paint(g);
                }
                @Override
                public void paintAll(Graphics g)
                {
                    ((Graphics2D)g).setTransform(Test.this.scalingTransform);
                    super.paintAll(g);
                }
                @Override
                public void paintComponents(Graphics g)
                {
                    ((Graphics2D)g).setTransform(Test.this.scalingTransform);
                    super.paintComponents(g);
                }
                @Override
                public void paintComponent(Graphics g)
                {
                    ((Graphics2D)g).setTransform(Test.this.scalingTransform);
                    super.paintComponents(g);
                }
            };
            Container oldPane = this.getContentPane();
            drawScale.setLayout(oldPane.getLayout());

            this.setContentPane(drawScale);
}

эти методы рисования были, конечно, в дополнение к тем, что были в апплете.

person S E    schedule 12.01.2011