【问题标题】:How to successfully modify the way a JFrame (and all of its components) paint?如何成功修改 JFrame(及其所有组件)的绘制方式?
【发布时间】:2012-04-29 08:31:39
【问题描述】:

我正在尝试在 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 的绘制调用?还有其他(更好的)方法可以缩放我的窗口吗?感谢您提供任何和所有帮助!

【问题讨论】:

    标签: java swing window scale repaint


    【解决方案1】:

    使用

    javax.swing.SwingUtilities.updateComponentTreeUI(parentComponent);
    

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

    【讨论】:

    • 非常感谢,我把它放在我的g2d.scale(2,2); 电话下面,现在一切都调整好了。我的下一个问题是:这有多浪费?我应该把那个语句放在我的构造函数中吗?别的地方?把它留在paint方法中好吗?
    • 要回答这个问题,您应该打开源代码来查看它的作用。它实际上对每个子组件调用 updateUI()。多浪费?仅与您不需要更新的额外组件一样多。也许,如果您知道要更新哪些组件,请直接在这些组件上调用 updateUI()?如果需要,请尝试对过程进行计时,或使用分析器查看它对性能的影响。
    • 再次感谢,但你能澄清一下吗:我真正想问的是:我每次画画时都需要打电话吗?或者我可以在构造函数中设置一次(容器总是具有相同的组件),然后保持不变?
    • @KyleBuzsaki 您需要根据需要调用它。这意味着,无论何时绘制组件(如果它们没有正确更新)。当然,另一种方法是在重新绘制后使组件无效()和验证()。所做的只是让组件执行 doLayout(),这会提示布局管理器重新布局组件。
    • 我不能赞同这种做法;更多here.
    【解决方案2】:

    如Painting in AWT and Swing: The Paint Methods 中所述,“Swing 程序应覆盖paintComponent(),而不是覆盖paint()。”一种常见的方法是通过在JComponent(或子类)中覆盖paintComponent() 来创建一个视图,如here 所示。让您的视图监听游戏模型的变化,正如here所讨论的那样。

    SwingUtilities.updateComponentTreeUI() 应该用于更改Look & Feel,而不是更新视图。

    【讨论】:

    • 您能否详细说明在这种情况下如何使用视图?我查看了 View 及其子类,它们似乎都与文本密切相关,而不是一般的组件绘制。我也找不到轻松操作放大倍率的方法。
    • 我在A Swing Architecture Overview中讨论的意义上使用了view这个词。
    猜你喜欢
    • 2016-09-18
    • 2023-03-03
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多