所以这个问题的初始设置是有一个JDialog,在里面我已经放置了一个JPanel来容纳其余组件(因为绘制JDialog本身显然是一个坏主意)。这个JPanel有一个覆盖paintComponent(Graphics g)的方法,它只绘制背景并为审美目的添加一个微弱的边框。
现在里面是一系列JPanels,它们对包含的表单组件进行分类,每个JPanel也有一个重写的paintComponent(Graphics g),绘制一个半透明的背景。
在每个JPanels中,我开始遇到一些问题,大概是透明的。我在这些面板中有JTextFields,JCheckBoxes,JLabels,JSliders等,当你与其中一个进行交互时(悬停,点击等),背景从透明变为不透明,其中一个偶然的幻影图像来自另一个领域(看似略显随机)有时)。我正在使用custom LAF called Web,但我使用其他内置的LAF进行了测试,同样的事情发生了。
这是Java的故障还是搞砸了?如果是这样,我该怎么补丁呢?我可以在必要时粘贴代码片段,但是我使用了几个自定义类和九个补丁样式的图像拼接,这可能会使代码片段难以遵循。提前谢谢!
答案 0 :(得分:2)
如果要绘制具有透明背景的组件,则将组件标记为透明(setOpaue(false)
)非常重要,以便重绘管理器知道它必须在其下方绘制组件。
当您执行自定义绘画时,首先调用super.paintComponent
也是非常重要的。
在透明组件的情况下,这一点尤为重要,因为这会为绘制准备Graphics
上下文。
Graphics
是共享资源。窗口中绘制的所有组件都将共享相同的Graphics
对象,这意味着如果您不允许paintComponent
首先准备它,那么您将看到之前绘制的内容。