переопределяющий метод рисования в JApplet - PullRequest
4 голосов
/ 12 января 2011

Я работаю над проектом, чтобы содержимое 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);
    }
}

1 Ответ

1 голос
/ 12 января 2011

После долгих исследований я понял, что проблема в том, что метод рисования 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);
}

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

...