【问题标题】:How to solve graphical glitching with JDialog, JPanel?如何使用 JDialog、JPanel 解决图形故障?
【发布时间】:2013-06-22 07:16:53
【问题描述】:

所以这个问题的初始设置是有一个 JDialog,在里面我放置了一个 JPanel 来容纳其余的组件(因为绘制 JDialog 本身显然是一个坏主意)。这个 JPanel 有一个重写的 paintComponent(Graphics g) 方法,它只绘制背景并添加一个微弱的边框以达到美感。

现在里面是一系列 JPanel,它们对包含的表单组件进行分类,每个 JPanel 也有一个覆盖的 paintComponent(Graphics g),绘制一个半透明的背景。

在每个 JPanel 中,我开始遇到一些问题,大概是透明度问题。我在这些面板中有 JTextFields、JCheckBoxes、JLabels、JSlider 等,当您与其中一个交互(悬停、单击等)时,背景从透明变为不透明,偶尔会出现来自另一个字段的重影图像(看起来有点随机有时)。我使用的是custom LAF called Web,但我使用其他内置 LAF 进行了测试,同样的事情发生了。

这是 Java 的故障还是我搞砸了?如果是这样,我该如何修补?如有必要,我可以稍后粘贴代码片段,但我使用了几个自定义类和九个补丁样式的图像拼接,这可能会使代码片段难以遵循。提前致谢!

【问题讨论】:

  • 确保正在绘制透明度的组件已设置为透明(setOpaque(false)),这将使重绘管理器知道它必须绘制它背后的内容
  • 另外,非常重要的是,在进行任何自定义绘画之前,请确保您已致电 super.paintComponent
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 你先生(@MadProgrammer)是非常正确的。如果您愿意将您的建议外化为答案,我会接受!非常感谢!

标签: java swing jpanel transparency look-and-feel


【解决方案1】:

如果您使用透明背景绘制组件,则将组件标记为透明 (setOpaue(false)) 非常重要,以便重绘管理器知道它必须绘制其下方的组件。

在执行自定义绘画时,首先调用super.paintComponent,这一点也很重要。

这在透明组件的情况下尤其重要,因为这会为绘制准备 Graphics 上下文。

Graphics 是共享资源。在您的窗口中绘制的所有组件将共享同一个Graphics 对象,这意味着如果您不允许paintComponent 首先准备它,那么您将看到之前绘制的内容。

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多