Prev: Generics: instantiating an object from a class name in configuration
Next: Best Java Collection Book
From: John B. Matthews on 11 Jul 2010 23:30 In article <i1dr8g$fr2$1(a)news.eternal-september.org>, markspace <nospam(a)nowhere.com> wrote: [...] > > 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. Much better! Alas, I am cursed with a heavy editorial hand, and "Test" was the last thing I _hadn't_ changed. :-) A correspondent prompted me to consider creating a template. At least, NetBeans will require a different name, if not a good one. import java.awt.Dimension; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; /** @author John B. Matthews */ public class ${name} extends JPanel implements Runnable { public static void main(String[] args) { EventQueue.invokeLater(new ${name}()); } @Override public void run() { JFrame f = new JFrame("${name}"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public ${name}() { this.setPreferredSize(new Dimension(640, 480)); } } -- John B. Matthews trashgod at gmail dot com <http://sites.google.com/site/drjohnbmatthews>
From: Eustace on 12 Jul 2010 06:37 On 2010-07-11 15:35 John B. Matthews wrote: > 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> Thanks for your replies. It was only reasonable that it had to be an automatic way to make the dimensions of the window the desired ones. The border was not the main issue in my original posting. I could just as well have drawn any rectangle equidistant to the sides of the window to make my point, or a circle inscribed in it. In my program I follow an example of the book "Java In Easy Steps" (Painting application fonts and colors, p.150-1). This is by far the shortest of the 3 books I studied learning Java, (keeping the programs - exercises in them handy to consult in the future when necessary as a first source of help,) and yet I find it the most helpful for quick answers. One of the others was for preparation for the certification exam, and it included topics like Threads and Streams, things that I did not expect to need any time soon. However, I do not remember encountering "EventQueue.invokeLater()" or "@Override" there. I would prefer to solve the problem without using things I do not yet understand, it seems, however, I have to follow your approach above to do so. Thanks again, emf -- It ain't THAT, babe! - A radical reinterpretation https://files.nyu.edu/emf202/public/bd/itaintmebabe.html
From: Lew on 12 Jul 2010 08:47 Eustace wrote: > However, I do not remember > encountering "EventQueue.invokeLater()" or "@Override" there. I would > prefer to solve the problem without using things I do not yet > understand, it seems, however, I have to follow your approach above to > do so. Read the Javadocs and the Swing tutorial for the former, and Javadocs for the latter. The former (or its sister 'invokeAndWait()') are mandatory to put GUI events on the EDT. '@Override' marks that a method overrides a parent type's method, e.g., 'equals()' from 'Object'. If you goof, for example in public class Foo { @Override public boolean equals( Foo foo ) { ... the annotation produces a compile-time error instead of silently approving a bug that would really bite if not diagnosed until production. -- Lew
First
|
Prev
|
Pages: 1 2 Prev: Generics: instantiating an object from a class name in configuration Next: Best Java Collection Book |