【问题标题】:AWT and Swing components not rendering properlyAWT 和 Swing 组件未正确呈现
【发布时间】:2021-12-07 01:59:27
【问题描述】:

我有一个在我们公司使用的应用程序,用于在服务器上搜索与客户相关的文件(macOS 提供的搜索失败,甚至 FoxTrotSearch 等第三方程序也无法找到网络驱动器上的所有文件)。

有时(可能有 10% 的时间),Preference Frame 未完全呈现。一些组件只是在屏幕上丢失,但由于其他组件正确放置在空白区域周围,因此以某种方式存在。如果我选择另一个窗口/框架/应用程序,则会出现缺少的组件。

我已经注意到,当涉及更多组件时,问题出现的频率更高。有时仅缺少几个组件,有时接近 50%。

我在调用validate(); pack(); setVisible(true);之前放置并添加了所有组件

我是否缺少某些东西,或者这是一种必须接受的行为?

为了完整性:我正在使用以下组件:

  • java.awt.Component
  • java.awt.Label
  • java.awt.TextField
  • javax.swing.JCheckBox
  • javax.swing.JFrame
  • javax.swing.JSeparator
  • javax.swing.JSpinner
  • (java.awt.FlowLayout)
  • (javax.swing.BoxLayout)

【问题讨论】:

  • 1) 不要混合 Swing 和 AWT 组件。而不是 Component, Label & TextField 使用 JComponent, JLabel & JTextField 2) 在 EDT 上启动 GUI。
  • 我会努力删除 AWT Label 和 TextField 组件,并用 Swing JLabel 和 JTextField 组件替换它们。 AWT 和 Swing 组件不能很好地协同工作。没有看到任何代码,很难进一步评论,但不,组件不应该隐藏。
  • 为了完整性 我会说发布 minimal reproducible example 将构成完整性,而不仅仅是您正在使用的 [GUI] 组件的列表。
  • 无法添加最小可重现示例。该问题已经不是 100% 可重现的,并且已证明与数据大小有关,因此使示例最小化显然可以解决问题。
  • @AndrewThompson 感谢您的编辑和评论。解决方法 1) 解决了问题。 2) 不适用,因为已经实施。您能否将其发布为答案,以便我接受。

标签: java macos swing awt rendering


【解决方案1】:

不要混合使用 Swing 和 AWT 组件。由于 Swing 提供轻量级组件,而 AWT 具有重量级组件,因此将它们混合在一起可能(通常确实)会导致问题。

I.E.而不是ComponentLabelTextField 使用JComponent(或JPanel)、JLabelJTextField

注意:Swing建立在 AWT 组件之上——Swing 组件的继承层次通常最终会回到 AWT 组件。 Swing 还使用大量 AWT API(打印、Java2D 字体等)和许多基于 AWT 的布局。这只是我们需要小心的组件。

【讨论】:

    猜你喜欢
    • 2020-02-19
    • 2020-02-12
    • 2019-08-26
    • 2012-05-30
    • 2011-12-06
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多