Java Applet Wrapper Scale输出

时间:2014-08-06 23:48:09

标签: java swing applet wrapper

我正在为Notch" Chambered"的前奏创建一个包装器,我希望这样做,以便您可以调整窗口大小。我无法弄清楚如何使内容扩展,我试图覆盖onPaint。我无法修改Jar来完成这项任务。

onPaint尝试:

package com.gudenau.pc.poc;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

public class JScaledFrame extends JFrame {

    private static final long serialVersionUID = 4044340683411982494L;

    public JScaledFrame(String title) {
        super(title);
    }

    @Override
    public void paint(Graphics graphics){
        Dimension min = getMinimumSize();
        Dimension size = getSize();

        BufferedImage image = new BufferedImage(min.width, min.height, BufferedImage.TYPE_4BYTE_ABGR);
        Graphics subGraphics = image.getGraphics();
        super.paint(subGraphics);
        subGraphics.dispose();

        graphics.drawImage(image, 0, 0, size.width, size.height, null);
    }
}

3 个答案:

答案 0 :(得分:1)

不要在JFrame等顶级容器上绘画。使用JComponentJPanel。覆盖paintComponent()进行绘画而不是paint(),不要忘记致电super.paintComponent(g)

paintComponent中绘画没有别的。避免将额外的程序逻辑或不必要的分配放入该方法中。绘画操作应该快速和优化,以获得更好的性能和用户体验。

另外,在调用null时,请避免drawImage图像观察者。 JPanel例如实现了ImageObserver,因此如果扩展this,您可以通过JPanel

有关详细信息,请参阅Performing Custom Painting。另请参阅Painting in AWT and Swing

答案 1 :(得分:1)

缩放内容非常困难。您想要的是更改绘制基础组件的Graphics上下文的缩放上下文。

通常,您要做的是覆盖违规组件的paint方法并应用您想要的缩放系数...

public class MyExtendedClass extends ... {
    @Override
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D)g.create();
        double scaleFactor = 1d;
        // Calculate the scaling factor to apply
        // based on the "default" size and the
        // current size...
        g2d.scale(scaleFactor, scaleFactor);
        super.paint(g2d);
        g2d.dispose();
    }
}

这可能会引入各种奇怪的问题,坦率地说,更强大的解决方案可能是使用JXLayer / JLayer,例如......

您可能还会发现使用AffineTransform更容易......

答案 2 :(得分:0)

由于看起来普通Java很难做到这一点,我将使用ASM库实现一些黑暗魔法。我希望不需要这样做,但似乎无法缩放从外部jar加载的画布。