Re: Frustrated by AWT..need some help
printdude1968@gmail.com wrote:
Question: After poking around Swing, I am wondering if it is possible
to create a very simple
panel with 3 circles that can be filled with different colors. Using
Skip the panel, one is provided for you by default.
What I recommended was to make four buttons, since those are easy to
place, then just set the image (Icon) for the button manually. You will
run into a little niggle when you try to update the button images on the
fly. I think you just have to call pack() on the JFrame to get it to
update; you'll have to investigate this yourself.
Since you seem to be having a bit more trouble than I thought, I did
this myself to make sure my answers were ok. Here's what I did:
1. NetBeans open, pick New Project -> name it TrafficLightTest, package
name same.
2. On the Source package TrafficLight, pick New->JFrame-> class name
TrafficLight.
3. Click on the JButton on the pallet on the right, hold down shift, and
plunk down four buttons.
Total time so far: less than 60 seconds.
4. I added three more buttons on the bottom of the JFrame for maybe
controls or something. Haven't named them yet. Maybe Start, Stop,
Pause/Step eventually. Took 6 seconds to add them so what the heck.
5. Now lets get something going. Make sure you can create this thing as
is. Go back to the main class that NetBeans created for the whole
project ("Main.java" normally) and add:
// TODO code application logic here
TrafficLight test = new TrafficLight();
test.setVisible( true );
to the main method. OK that took longer than 60 seconds but not much.
6. Hit Clean and Build and then Debug (always use debug in case you
have to kill it manually with the Debug "stop" button), it should throw
up a JFame with your buttons. Good enough.
This is Patricia Shanahan's principle of small steps, btw. There's
little danger of messing up a JFrame and 7 buttons with Matisse, but as
soon as we write code by hand we start checking it carefully. Our two
lines are working so let's move on now.
7. I have no idea how to add an image/icon to a button so I Google for
"java image jbutton". It takes me here:
http://java.sun.com/docs/books/tutorial/uiswing/components/button.html
There's some pretty good code right at the top of the page so let's copy
it into the JFrame object, TrafficLight.
/** Creates new form TrafficLight */
public TrafficLight()
{
initComponents();
ImageIcon redButtonIcon = createImageIcon("images/red.gif");
ImageIcon yellowButtonIcon = createImageIcon("images/yellow.gif");
ImageIcon greenButtonIcon = createImageIcon("images/green.gif");
jButton1.setIcon( redButtonIcon );
jButton2.setIcon( yellowButtonIcon );
jButton3.setIcon( greenButtonIcon );
}
protected static ImageIcon createImageIcon(String path)
{
java.net.URL imgURL = TrafficLight.class.getResource(path);
//...//error handling omitted for clarity...
return new ImageIcon(imgURL);
}
I used cut and paste (Patricia would say to re-type by hand). It's
short and I'm going to be altering it carefully, so that's almost as
good as re-typing by hand. The changes are already made above. I
realize now that I didn't call pack() after calling setIcon(). I should
investigate this further, but it worked. I'm curious why.
8. Compile this. You'll find you have to add one import for
javax.swing.ImageIcon. If you were paying attention, NetBeans told you
this while you were editing it (the little red X on the side bar on the
left of the editor window). Compile again and make sure it completes
successfully.
9. Try it as is. Don't for get to run with Debug in case you have to
kill it manually with the stop button. Again we're using smallest steps
here. And I want to see what the code does (sans the error checking
from the comment in createImageIcon()). As expected, it faults. Try
clicking on the error message and you'll go straight to the offending
line in the program. It's fun.
10. Ok time to add the .gifs. This is easier than trying to draw them
with AWT. Later, you can create them on the fly. Get this working
first. Smallest steps. I used Gimp to make the images but anything
would work. You can even just go to a browser and download ANY small
image. It doesn't matter what.
11. To add a resource, first notice that this one is relative (resource
name doesn't start with a "/"). That means the resource loader will
look in the trafficlight package directory for them. First add the
subdirectory "images". Right click on the package "trafficlight" in the
NetBeans project tree on the left. Choose "New Folder" from the pop up
menu. Type "images" for the folder name, and click Finish. Notice that
NetBeans creates a new package looking thingy called trafficlight.images
This is just NetBeans trying to trip you up. You can look at the
project with a file browser if you want to verify that your directory
"images" is actually in the right spot.
12. Finally, draw, download or save the images you want to use to
..../TrafficLightTest/src/trafficlight/images/
13. Now compile and make sure it doesn't fault again. You might have
to debug a file name or file type mismatch (I did). But once everything
is spelled correctly it should work.
Total time should be about 10-15 minutes up to the point where you have
to draw stuff with Gimp. It took me longer to figure out how to create
a resource directory but that's because I got lost reading something
unrelated. Welcome to the internet.
Full source code below. Remember the bits I actually had to type out
are already given above.
First the Main.java file Netbeans creates for the whole project, then
the JFrame object TrafficLight.
/*
* Main.java
*
* Created on June 1, 2007, 12:01 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package trafficlighttest;
public class Main
{
/** Creates a new instance of Main */
public Main()
{
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
// TODO code application logic here
TrafficLight test = new TrafficLight();
test.setVisible( true );
}
}
/*
* TrafficLight.java
*
* Created on June 1, 2007, 12:01 PM
*/
package trafficlighttest;
import javax.swing.ImageIcon;
public class TrafficLight extends javax.swing.JFrame
{
/** Creates new form TrafficLight */
public TrafficLight()
{
initComponents();
ImageIcon redButtonIcon = createImageIcon("images/red.gif");
ImageIcon yellowButtonIcon = createImageIcon("images/yellow.gif");
ImageIcon greenButtonIcon = createImageIcon("images/green.gif");
jButton1.setIcon( redButtonIcon );
jButton2.setIcon( yellowButtonIcon );
jButton3.setIcon( greenButtonIcon );
}
protected static ImageIcon createImageIcon(String path)
{
java.net.URL imgURL = TrafficLight.class.getResource(path);
//...//error handling omitted for clarity...
return new ImageIcon(imgURL);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents()
{
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jButton4 = new javax.swing.JButton();
jButton5 = new javax.swing.JButton();
jButton6 = new javax.swing.JButton();
jButton7 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("jButton1");
jButton2.setText("jButton2");
jButton3.setText("jButton3");
jButton4.setText("jButton4");
jButton5.setText("jButton5");
jButton6.setText("jButton6");
jButton7.setText("jButton7");
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
..addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jButton2)
..addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
218, Short.MAX_VALUE)
.addComponent(jButton3))
.addGroup(layout.createSequentialGroup()
.addGap(146, 146, 146)
..addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jButton4)
.addComponent(jButton1)))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jButton5)
..addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jButton6)
..addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
132, Short.MAX_VALUE)
.addComponent(jButton7)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jButton1)
.addGap(42, 42, 42)
..addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton2)
.addComponent(jButton3))
.addGap(29, 29, 29)
.addComponent(jButton4)
..addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
103, Short.MAX_VALUE)
..addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton5)
.addComponent(jButton6)
.addComponent(jButton7))
.addContainerGap())
);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
new TrafficLight().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JButton jButton5;
private javax.swing.JButton jButton6;
private javax.swing.JButton jButton7;
// End of variables declaration
}