2

我正在尝试在 java 的 swing 库中实现一个简单的窗口比例。目标只是将窗口的高度和宽度加倍,并按比例绘制窗口及其每个组件。

这是我正在使用的代码示例:

public class MyWindow extends JFrame {

...

public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.scale(2,2);
    super.paint(g);
}
}

此窗口中每个我的组件的位置和大小是使用 setBounds 手动设置的,窗口布局为空。

当我实际运行程序时,窗口的第一次绘制似乎成功了——一切都调整了合适的大小。然而,组件随后的每次重绘既不是两倍大小,也不是在正确的位置。这就是我的意思:

游戏视图

如您所见,具有手动调用重绘的组件(动画位)的屏幕部分似乎没有使用 JFrame 的 Graphics2D 比例。我查看了源代码,并尝试重载其他一些方法(主要是更新和重绘),但它们似乎都产生了相同的结果。我进一步查看了组件和容器类的paint和repaint方法,但它们似乎都调用了它们父类的指定repaint。我的 Window 不应该是“最大”的父母吗?如果是这样,为什么这些重绘调用没有到达我的窗口?

因此,我对您的最大问题是:子组件调用父组件的哪些重绘方法?为什么调用没有正确路由到我的 JFrame 的绘制调用?还有其他(更好的)方法可以缩放我的窗口吗?任何和所有的帮助表示赞赏!

4

2 回答 2

1

正如在 AWT 和 Swing 中的绘画:绘画方法中所讨论的,“Swing 程序应该覆盖paintComponent()而不是覆盖paint()”。一种常见的方法是通过覆盖(或子类)来创建视图paintComponent(),如下所示。让你的视图监听游戏模型的变化,正如这里所讨论的。JComponent

SwingUtilities.updateComponentTreeUI()应该用于更改外观,而不是更新视图。

于 2012-04-18T06:08:34.123 回答
0

利用

javax.swing.SwingUtilities.updateComponentTreeUI(parentComponent);

当您需要确保parentComponent正确更新所有 s 子组件的外观时。

于 2012-04-18T00:23:05.423 回答