Problem with basic JFrame layout manager
Hey all, here's a problem I can't lick.
Using just a basic JFrame, it should have a basic BorderLayout layout
manager by default. The docs strongly imply it, and it's manifest in
the code (source and runtime).
However, if I add my own component to the content pane, the JFrame when
displayed is as small as possible, only just large enough to display
it's decorations. I implement all the size methods, and it still
doesn't seem to do anything with them.
Does anyone know what I might be doing wrong?
Sample code follows. If I print out the classes involved (the first and
the second commented-out blocks) everything is as you'd expect. A
BorderLayout is present by default.
If I manually set the size of the content pane (first and third
commented-out blocks), the display is correct.
/*
* Captcha.java
*
* Created on Oct 3, 2007, 12:38:11 PM
*
*/
package captcha.oak;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import static javax.swing.WindowConstants.*;
public class Captcha extends java.awt.Component {
private static final int WIDTH = 250;
private static final int HEIGHT = 85;
private BufferedImage image;
/** Creates and displays a test captcha.
*
* @param args The command line arguments are ignored.
*/
public static void main(String[] args) {
// TODO code application logic here
Captcha c = new Captcha();
JFrame jf = new JFrame("Captcha");
jf.setDefaultCloseOperation(EXIT_ON_CLOSE);
jf.getContentPane().add(c, BorderLayout.CENTER);
// java.awt.Container cp = jf.getContentPane();
// LayoutManager lm = cp.getLayout();
// System.err.println( cp.getClass().getName()+":: "+cp);
// System.err.println( lm.getClass().getName()+"::"+lm );
// System.err.println( lm.getClass().getSuperclass().getName());
// cp.setPreferredSize(c.getPerferredSize());
jf.pack();
jf.setVisible(true);
}
public Captcha() {
int[] data = new int[WIDTH * HEIGHT];
for (int i = 0; i < data.length; i++) {
int red = randomInt(255);
int green = randomInt(255);
int blue = randomInt(255);
data[i] = (red << 16) | (green << 8) | blue;
}
this.image = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
image.setRGB(0, 0, WIDTH, HEIGHT, data, 0, WIDTH);
}
private int randomInt(int i) {
return (int) (java.lang.Math.random()* i);
}
public void paint(Graphics g) {
g.drawImage(image, 0, 0, this);
}
public Dimension getPerferredSize()
{
return getSize();
}
public Dimension getSize()
{
return new Dimension(WIDTH,HEIGHT);
}
public Dimension getMaximumSize()
{
return getSize();
}
public Dimension getMinimumSize()
{
return getSize();
}
}