Prev: Generics: instantiating an object from a class name in configuration
Next: Best Java Collection Book
From: Eustace on 11 Jul 2010 05:27 package temporary; import java.awt.*; import java.awt.geom.*; import javax.swing.*; public class Temp extends JFrame { Graphics2D painter2D; static int W = 1200; static int H = 600; static int B = 10; // border public Temp() { super("Temp"); setSize(W + 8, H + 36); // necessary adjustment System.out.println("1 " + getWidth() + " " + getHeight()); // 1 1208 636 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); Container contentArea = getContentPane(); CustomPanel panel = new CustomPanel(); contentArea.add(panel); setContentPane(contentArea); } public static void main(String[] args) { Temp instance = new Temp(); } class CustomPanel extends JPanel { public void paintComponent(Graphics painter) { System.out.println("2 " + getWidth() + " " + getHeight()); // 2 1200 600 painter2D = (Graphics2D) painter; painter2D.translate(0, H / 2); // middle horizontal 0 // draw the frame Color clr = Color.black; drawFrame(clr); } private void drawFrame(Color clr) { double x, y, w, h; x = 0 + B; y = -H / 2 + B; w = W - 2 * B; h = H - 2 * B; Rectangle2D.Double frame = new Rectangle2D.Double(x,y,w,h); painter2D.setColor(clr); painter2D.fill(frame); } } } In the above program, I want the active window (that is the area I am working in, without the top bar and the borders) to be 1200 by 600. To do so, I had to use setSize(W + 8, H + 36); to compensate for the width and height of the top bar and borders I have in my system. If I do not make this adjustments, the frame will be off-center. I found them empirically, by using System.out.println("2 " + getWidth() + " " + getHeight()); within the public void paintComponent(Graphics painter) { Is there a way to get the necessary adjustment values of the system automatically instead of empirically? Is there a way to reset the size after I know the values of the adjustments in the paintComponent(Graphics painter)? Thanks, emf -- It ain't THAT, babe! - A radical reinterpretation https://files.nyu.edu/emf202/public/bd/itaintmebabe.html
From: John B. Matthews on 11 Jul 2010 06:46 In article <i1c2p8$hj9$1(a)speranza.aioe.org>, Eustace <emfril(a)gmail.ccom> wrote: [...] > In the above program, I want the active window (that is the area I am > working in, without the top bar and the borders) to be 1200 by 600. > To do so, I had to use > > setSize(W + 8, H + 36); > > to compensate for the width and height of the top bar and borders I > have in my system. If I do not make this adjustments, the frame will > be off-center. I found them empirically, by using > > System.out.println("2 " + getWidth() + " " + getHeight()); > > within the > > public void paintComponent(Graphics painter) { > > Is there a way to get the necessary adjustment values of the system > automatically instead of empirically? Is there a way to reset the > size after I know the values of the adjustments in the > paintComponent(Graphics painter)? Set the preferred size of the panel and use pack(), which "causes this Window to be sized to fit the preferred size and layouts of its subcomponents." The method setBorder() sets the border of a component; it's easy to "put the component in a JPanel and set the border on the JPanel." As suggested previously, don't neglect to build your GUI on the EDT. import java.awt.*; import javax.swing.*; /** @author John B. Matthews */ public class Temp extends JFrame { private static final int B = 10; // border public Temp() { super("Temp"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(new GridLayout()); panel.setBorder(BorderFactory.createEmptyBorder(B, B, B, B)); panel.add(new CustomPanel()); this.add(panel); this.pack(); // adjust to the preferred size of subcomponents. this.setLocationRelativeTo(null); this.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new Temp(); } }); } 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()); } } } -- John B. Matthews trashgod at gmail dot com <http://sites.google.com/site/drjohnbmatthews>
From: Lew on 11 Jul 2010 12:47 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
From: John B. Matthews on 11 Jul 2010 15:35 In article <i1csh7$tgb$1(a)news.albasani.net>, Lew <noone(a)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>
From: markspace on 11 Jul 2010 21:30 John B. Matthews wrote: > 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.> /** @author John B. Matthews */ > public class Temp implements Runnable { > public static void main(String[] args) { > EventQueue.invokeLater(new Temp()); > } > > @Override > public void run() { This is interesting, but "Temp" isn't really a great name for any variable, let alone a class. Most things that are "run" on another thread can be described as a "task." This task above creates a GUI, so... public class CreateGuiTask implements Runnable { public static void main(String[] args) { EventQueue.invokeLater(new CreateGuiTask()); } @Override public void run() { // etc. This is just a bit more readable, imo.
|
Next
|
Last
Pages: 1 2 Prev: Generics: instantiating an object from a class name in configuration Next: Best Java Collection Book |