Re: JFrame window dimensions
In article <i1csh7$tgb$1@news.albasani.net>, Lew <noone@lewscanon.com>
wrote:
John B. Matthews wrote:
As suggested previously, don't neglect to build your GUI on the EDT.
...
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Temp();
}
});
}
And don't run the GUI from the constructor.
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Temp().setVisible(true);
}
});
}
Lew: Ah, a subtle trap for the unwary. Thanks for highlighting it. IIUC,
this is predicated on the idea that the constructor should complete
before invoking the instance's public methods.
Eustace: More on the recommended approach is shown in the "Initial
Threads" section of the tutorial [1]. Here's another idiom that avoids
the peril and obviates extending JFrame. Also, I've found it instructive
to run the program in a profiler while resizing the window, paying
particular attention to the event queue.
import java.awt.*;
import javax.swing.*;
/** @author John B. Matthews */
public class Temp implements Runnable {
private static final int B = 10; // border
public static void main(String[] args) {
EventQueue.invokeLater(new Temp());
}
@Override
public void run() {
JFrame frame = new JFrame("Temp");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout());
panel.setBorder(BorderFactory.createEmptyBorder(B, B, B, B));
panel.add(new CustomPanel());
frame.add(panel);
frame.pack(); // adjust to the preferred size of subcomponents.
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static final class CustomPanel extends JPanel {
private static final int W = 1200;
private static final int H = 600;
public CustomPanel() {
this.setPreferredSize(new Dimension(W, H));
this.setBackground(Color.black);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println(getWidth() + " " + getHeight());
}
}
}
[1]<http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/
concurrency/initial.html>
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>