我正在为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);
}
}
答案 0 :(得分:1)
不要在JFrame
等顶级容器上绘画。使用JComponent
或JPanel
。覆盖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加载的画布。