Strange GUI problem...

D

Daniel Pitts

Its hard to distill into an SSCCE, so I'll describe the problem as
well as I can...

I have a (rather complex) view, layed out with GridBagLayout. It
contains a JPanel in the very middle, which has a slightly transparent
background.

I have 4 visible JFrames which have this layout.

This middle panel starts out with a JButton in it. when the JButton is
pressed, all the middle panels remove their button, and replace it
with a JLabel.

When this happens, the JPanel appears to be partially redrawn with a
shared double-buffer which isn't cleared properly.

In other words, I'm seeing parts of my complex layout appear within
the middle panel, partially drawn over, and definitely not where they
belong. Any suggestions?

My current work around is that when the JPanel removes its button, it
called revalidate (which IS appropriate and correct), but then it
calls getTopLevelAncestor().repaint();

Is there a better solution?
 
K

Knute Johnson

Daniel said:
Its hard to distill into an SSCCE, so I'll describe the problem as
well as I can...

I have a (rather complex) view, layed out with GridBagLayout. It
contains a JPanel in the very middle, which has a slightly transparent
background.

I have 4 visible JFrames which have this layout.

This middle panel starts out with a JButton in it. when the JButton is
pressed, all the middle panels remove their button, and replace it
with a JLabel.

When this happens, the JPanel appears to be partially redrawn with a
shared double-buffer which isn't cleared properly.

In other words, I'm seeing parts of my complex layout appear within
the middle panel, partially drawn over, and definitely not where they
belong. Any suggestions?

My current work around is that when the JPanel removes its button, it
called revalidate (which IS appropriate and correct), but then it
calls getTopLevelAncestor().repaint();

Is there a better solution?

I'm not sure I can answer your question but I have a couple. What
happens if you call repaint() on the JPanel? And how is your complex
background, that the JPanel partially covers, drawn on the JFrame?
 
D

Daniel Pitts

I'm not sure I can answer your question but I have a couple. What
happens if you call repaint() on the JPanel? And how is your complex
background, that the JPanel partially covers, drawn on the JFrame?


The background is (or should be) empty.
Calling repaint on the JPanel doesn't do the trick. It paints the
corrupt buffer.
 
K

Knute Johnson

Daniel said:
The background is (or should be) empty.
Calling repaint on the JPanel doesn't do the trick. It paints the
corrupt buffer.

I guess I would have to see some code.
 
J

Judy Szikora

Daniel said:
Its hard to distill into an SSCCE, so I'll describe the problem as
well as I can...

I have a (rather complex) view, layed out with GridBagLayout. It
contains a JPanel in the very middle, which has a slightly transparent
background.

I have 4 visible JFrames which have this layout.

This middle panel starts out with a JButton in it. when the JButton is
pressed, all the middle panels remove their button, and replace it
with a JLabel.

When this happens, the JPanel appears to be partially redrawn with a
shared double-buffer which isn't cleared properly.

In other words, I'm seeing parts of my complex layout appear within
the middle panel, partially drawn over, and definitely not where they
belong. Any suggestions?

My current work around is that when the JPanel removes its button, it
called revalidate (which IS appropriate and correct), but then it
calls getTopLevelAncestor().repaint();

Is there a better solution?

JComponent has an 'opaque' property which it uses to decide whether to
repaint the ancestors, make sure it is set to false.
 
D

Daniel Pitts

JComponent has an 'opaque' property which it uses to decide whether to
repaint the ancestors, make sure it is set to false.

The JPanel is supposed to have a tranlucent green background, not a
transparent background. If I set opaque false, it doesn't draw the
jpanels transparent background... Perhaps this is a problem with
JPanel.

So, maybe my solution should be to have a non-opaque jpanel, but
overrider paintComponent to draw the translucent background anyway...
I'll try this at let everyone know.
 
D

Daniel Pitts

The JPanel is supposed to have a tranlucent green background, not a
transparent background. If I set opaque false, it doesn't draw the
jpanels transparent background... Perhaps this is a problem with
JPanel.

So, maybe my solution should be to have a non-opaque jpanel, but
overrider paintComponent to draw the translucent background anyway...
I'll try this at let everyone know.

Indeed, that worked.

I initialize my JPanel with setOpaque(false); and overright
paintComponent to draw the tranlucent background anyway. Works like a
charm.

Thanks every,
Daniel.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,431
Messages
2,571,677
Members
48,796
Latest member
Greg L.

Latest Threads

Top