John B. Matthews wrote:
In article <4a031806$0$25069$b9f67a60@news.newsdemon.com>,
Knute Johnson <nospam@rabbitbrush.frazmtn.com> wrote:
John B. Matthews wrote:
In article <Pine.LNX.4.64.0905071456310.20018@vega.soi.city.ac.uk>,
[...]
Concerning paintComponent():
<http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html>
[...]
I think there is something wrong with the docs there.
Well, they _did_ misspell invoke[r]. :-)
Why would you paint a non-opaque color onto an opaque background if
the component is opaque?
In this context, I thought opaque meant "the component paints every
pixel within its bounds." But now I wonder.
I've never had to use super.paintComponent() unless I wanted whatever
was drawn by the parent. Do you know how to create these artifacts?
I _used_ to see it happening when I'd set opaque to true but fail to
paint every pixel. In retrospect, I was probably painting with a
partially transparent color.
Trying the code below, with any combination of opaque and super, I
see no problems. Of course, I could be missing the point completely
:-).
On my implementation, the example's background is gray with no yellow at
all, I think due to multiple-buffering. Graphics#clearRect() says,
"Beginning with Java 1.1, the background color of offscreen images may
be system dependent. Applications should use setColor followed by
fillRect to ensure that an offscreen image is cleared to a specific
color."
With or without super.paintComponent(g), I get interesting artifacts
with non-opaque colors as I resize this window:
<code>
import java.awt.*;
import javax.swing.*;
public class OpaqueTest extends JComponent {
public OpaqueTest() {
this.setBackground(Color.yellow); // no effect
}
@Override
public void paintComponent(Graphics g) {
// super.paintComponent(g);
g.setColor(new Color(255, 0, 0, 128));
int w = getWidth();
int h = getHeight();
g.fillRect(0, 0, w, h);
g.setColor(new Color(0, 0, 255, 128));
g.fillRect(w/2 - w/4, h/2 - h/4, w/2, h/2);
}
@Override
public boolean isOpaque() {
return true;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
create();
}
private void create() {
final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(0, 2));
for (int i = 0; i < 4; i++) {
f.add(new OpaqueTest());
}
f.setSize(240, 180);
f.setVisible(true);
}
});
}
}
</code>
[...]
super.paintComponent(). That is apparently the one real difference
between a JComponent and a JPanel.
In any of the cases however, I do not see any artifacts. I'm running
1.6.0_14-ea on Windows XP.