Problem with basic JFrame layout manager

M

Mark Space

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 = (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();
}
}
 

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

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top