【问题标题】:Java Applet Wrapper Scale OutputJava Applet Wrapper 规模输出
【发布时间】:2014-08-06 23:48:09
【问题描述】:

我正在为 Notch 的“Prelude of the 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);
    }
}

【问题讨论】:

  • 为什么要在 Swing 中实现双缓冲策略? Swing 组件已经是双缓冲的......除了顶级容器,但你真的不应该在没有充分理由的情况下覆盖绘画
  • 我需要从 Applet 缩放图像。
  • 那么这确实是一个好方法,您可以缩放“视图”,但这不会缩放它处理事件的方式。看看this examplethis example,它们允许您缩放组件,但也可以缩放它们需要操作的事件......请注意,我相信它只适用于 Swing
  • 如果您使用的是基于 AWT 的小程序,您可能会发现这是不可能的,因为 AWT 组件通常在本机级别呈现......并不是说不可能,但还有很多事情要做考虑...
  • 所有输入都来自键盘,因此缩放不是问题。

标签: java swing applet wrapper


【解决方案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 更容易...

【讨论】:

  • +1 你对这个问题的解释要好得多:)
【解决方案2】:

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

paintComponent 上画画,别无其他。避免在该方法中添加额外的程序逻辑或不必要的分配。绘制操作应该快速且经过优化,以获得更好的性能和用户体验。

另外,在调用drawImage 时避免使用null 图像观察者。 JPanel 例如实现了ImageObserver,所以如果扩展JPanel,你可以传递this

请参阅Performing Custom Painting 了解更多信息。另见Painting in AWT and Swing

【讨论】:

  • 这将如何扩展 Applet?这就是我需要做的。
  • @gudenau 我误解了你的问题。我不确定您是否可以扩展本机组件。但是,游戏的源代码是可用的。您可以将EscapeComponent.SCALE = 4 更改为其他内容以实现其他大小。
【解决方案3】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多