Re: FlowLayout and lightweight IDEs
On Aug 9, 11:08 pm, bH <bherbs...@hotmail.com> wrote:
On Aug 9, 6:28 pm, "John B. Matthews" <nos...@nospam.invalid> wrote:
In article
<b0fd658a-18f1-4264-986d-179ca9378...@w7g2000hsa.googlegroups.com>,
bH <bherbs...@hotmail.com> wrote:
On Aug 8, 2:44 pm, "John B. Matthews" <nos...@nospam.invalid> wrote=
:
In article <489c6ec2$0$4045$b9f67...@news.newsdemon.com>,
Knute Johnson <nos...@rabbitbrush.frazmtn.com> wrote:
bH wrote:
This Q is about using a FlowLayout.
[...]
I compiled it and it displayed and ran. I don't use an IDE so =
I can't
help you there. It is possible that your problem is from not c=
reating
the GUI on the EDT. And speaking of the EDT, you block it whil=
e
retrieving your image. Any change that would occur to the disp=
layed
components will not happen until the EDT is freed. This may or=
may not
cause you to lose some of your GUI but the GUI will not be able t=
o
respond until the image gathering code returns.
Knute's right about blocking. There's more here about perceived
performance when loading an image here:
<http://java.sun.com/docs/books/tutorial/uiswing/components/icon.ht=
ml>
Also, I'm suspicious of overriding the JFrame's paint() method
(inherited from Container), without calling super.paint():
[...]
<http://groups.google.com/group/comp.lang.java.help/msg/bb2203c080c1b4e=
2?
hl=en>
[...]
Thanks for your responses. I have been unable to reconstruct the
program using panels. That rewrite of placing it on a panel makes non=
e
of the labels and textfields appear reagrdless of which IDE I use. Ye=
s
I did download John's sample above and it runs. but my adapting it to
my original one does not work. If I place the mouse over some of the
buttons they show up but nothing else shows up.
Yes, as documented: if I override paint in my code (above), I get the
same effect. If I call super.paint(), I don't:
public void paint(Graphics g) { super.paint(g); ... }
Instead, just have your button set the imageLabel's icon to whatever
image you get back from the server and call repaint():
public void actionPerformed(ActionEvent ae) {
String cmd = ae.getActionCommand();
if ("quit".equals(cmd)) {
System.exit(0);
} else if ("grab".equals(cmd)) {
try {
ImageIcon icon = new ImageIcon(new URL(
"<some valid chart url>"));
imageLabel.setIcon(icon);
imageLabel.repaint();
} catch (MalformedURLException e) {
System.err.println(e.toString());
}
}
}
So I went back to my design written above with these revsions below.
Did you mean to post code below?
[...] This is not a good programming example, too quirky.
Or that it's too quirky to post?
--
John B. Matthews
trashgod at gmail dot com
home dot woh dot rr dot com slash jbmatthews- Hide quoted text -
- Show quoted text -
Hi John,
Your efforts are appreciated. Thanks for the reply. I have to study
this a while longer and do an acceptable revision that fully opens
with all three IDE's not just one. Since it happens with only one,
that is my defintion of quirky. I will post the code below.
bH- Hide quoted text -
- Show quoted text -
Hi All,
This is the corrected program fixing the errors
that I questioned about above. It is no longer
quirky.
Andrew, I have tried to limit it to the correct text
width. With the fix and the notes in place, it is no longer
a small program. I also tried to take the suggestions
of others to make it happen.
bH
The program:
/* demo taken from :
http://www.cs.stir.ac.uk/~sbj/examples/Java-applications
/DrawImageDemo/
With this program the user can adjust measures, colors
when downloading a pentagon shape from Google.
The Google Developers Guide site is:
http://code.google.com/apis/chart/
*/
import java.text.*;
import java.awt.image.*;
import java.net.*;
import java.util.Date;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.*;
import java.io.*; // For IOException
public class DrawImageCentered extends JFrame
implements ActionListener {
// Start up the application
public static void main(String args[]) {
DrawImageCentered app = new DrawImageCentered();
app.setSize(800,500); //explicitly sets the size
// app.pack(); // app.pack() makes the window
// exactly the right size for its laid out contents
app.setVisible(true);
} // main
private BufferedImage image;
private ClassLoader cl = getClass().getClassLoader();
// So we can load image resources
private JButton choice1 =
new JButton("Google Draw Image"),
choice2 = new JButton("Save Image"),
choice3 = new JButton("Close");
private JTextField addressField = new JTextField
("http://chart.apis.google.com/chart?"),
appendFieldcht = new JTextField("r"),
appendFieldchs = new JTextField("400x400"),
appendFieldchd = new JTextField("t:70,70,70,70,70,70"),
appendFieldchm = new JTextField("B,FF0000,0,0,5"),
appendFieldchf = new JTextField("c,s,000000");
private JLabel lblhttp = new JLabel ("http:"),
lblcht = new JLabel("cht:"),lblchs = new JLabel("chs:"),
lblchd = new JLabel("chd:"),lblchm = new JLabel("chm:"),
lblchf = new JLabel("chf:");
private MyCanvas thePicture = new MyCanvas();
// Widget for displaying the image
// Constructor: lays out the display
public DrawImageCentered() {
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(lblhttp); contentPane.add(addressField);
contentPane.add(lblcht); contentPane.add(appendFieldcht);
contentPane.add(lblchs); contentPane.add(appendFieldchs);
contentPane.add(lblchd); contentPane.add(appendFieldchd);
contentPane.add(lblchm); contentPane.add(appendFieldchm);
contentPane.add(lblchf); contentPane.add(appendFieldchf);
contentPane.add(thePicture);
contentPane.add(choice1);
choice1.addActionListener(this);
contentPane.add(choice2);
choice2.addActionListener(this);
contentPane.add(choice3);
choice3.addActionListener(this);
} // DrawImage constructor
// actionPerformed: get picture to display and notify
// the canvas
public void actionPerformed(ActionEvent e) {
if(e.getSource() == choice1){ // get image from google
// address
String urlGoogleDrw = addressField.getText()+"cht="+
appendFieldcht.getText().trim()+"&chs="+
appendFieldchs.getText().trim()+"&chd="+
appendFieldchd.getText().trim()+"&chm="+
appendFieldchm.getText().trim()+"&chf="+
appendFieldchf.getText().trim();
try {
// Read from assembled URL
System.out.println(urlGoogleDrw);
URL url = new URL(urlGoogleDrw);
image = ImageIO.read(url);
thePicture.setImage(image);
}
catch (IOException em) {
System.out.println("import Data: I/O exception");
}
System.out.println
("Now press Save Image Button if you want to save it");
} //choice 1
if(e.getSource() == choice2){
try {
System.out.println("inside of Save it");
Date dNow = new Date();
SimpleDateFormat formatter = new SimpleDateFormat
("yyMMddHHmmssZ");
String df = new String(formatter.format(dNow));
File file =
new File("C:/Documents and Settings/bH/Desktop/"
+ df + " imageFromGoogle.png");
ImageIO.write(image, "png", file);
System.out.println
("finished writing, see Desktop file");
}
catch (IOException et) {
}
} //choice 2
if(e.getSource() == choice3){
System.exit(0);
} //choice 3
} // action draw picture
/* Class MyCanvas: to display a chosen image.
The image to be displayed is notified to this class by
calling its setImage method.
Constructor: only need to set up the size here,
so the layout manager knows
*/
class MyCanvas extends Canvas {
public MyCanvas() {
setBackground(Color.pink);
// This let us see how big the canvas is!
setSize(300,400);
} // MyCanvas constructor
private Image image; // The image on display just
//now (nothing initially)
// Set a new image to be displayed, and
// refresh the canvas on-screen
public void setImage(Image newImage) {
image = newImage;
repaint();
} // setImage
// And this actually draws the image, centered in
// the canvas
public void paint(Graphics g) {
if (image != null) {
// Make sure that there is an image
int xOffset = (getWidth()-image.getWidth(this))/2;
// x and y offsets to center the image in the
// canvas
int yOffset =
(getHeight()-image.getHeight(this))/2;
g.drawImage(image, xOffset, yOffset, this);
// Note: Coordinates relative to this Canvas widget
}
} // paint
} // class MyCanvas
}