//===================================================================
// Grid.java -- demo Grid Layout with ImageButton -- by tsaiwn@csie.nctu
// This Java program can be run both as Applet and as Application.
// Required the file MyApplet.java
/// This program, Grid.java, and MyApplet.java, as long as all
// necessary image files and audio files can be found here:
///
// http://www.csie.nctu.edu.tw/~tsaiwn/course/java/examples/grid/
///
// To run as an Application: java Grid
//////////
/***** When used as an Applet, embed it in an HTML file as following:
Test Grid.class GridLayout, GridBagLayout
********************************************************************/
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.text.*;
//import javax.swing.ImageIcon; // for ImageButton
//import javax.swing.JButton;
//import javax.swing.JLabel;
import javax.swing.*;
public class Grid extends MyApplet implements ActionListener, SwingConstants
{
static final protected int DISPLAY_LENGTH = 38; // display initial len
static final private int WIDTH=558, HEIGHT=368;
static final Font DISPLAY_FONT =
new Font("Ludica Console", Font.BOLD, 24);
static final Color DISPLAY_BG_COLOR = new Color(198,188,188) ;
static final Color DISPLAY_FG_COLOR = new Color(255,58,88) ;
static final String CAPTION_LAB_MYPIC = "親一下吧"; // for Label
static final Color COLOR_LAB_MYPIC = Color.red;
static final String CAPTION_B_MYPIC = "This is a Button";
///
static final String LAUGH_NAME = "images/laugh.au";
static final Font myFont16 = new Font("標楷體", Font.BOLD, 16);
static final Font myFont18 = new Font("標楷體", Font.BOLD, 18);
static final Font myFont24 = new Font("標楷體", Font.BOLD, 24);
Toolkit toolkit;
Image imageDigits[ ] = new Image[10];
ImageIcon iconDigits[ ] = new ImageIcon[10];
Image imageFun[ ] = new Image[10];
ImageIcon iconFun[ ] = new ImageIcon[10];
JButton bDigits[ ] = new JButton[12];
Button bABC[ ] = new Button[8]; // ABCDEF+-
JButton [ ]bFun = new JButton[6];
static String btnCMD1[ ] = new String[12]; // 0..9, "+/-", .
final static String btnCMD2[ ] =
{ "21 A", "22 B", "23 C", "24 D", "25 E", "26 F",
"27 +", "28 -"};
final static String btnCMDFun[ ] =
{ "31 open", "32 nextp", "33 relative",
"35 Mouth", "36 vote", "38 MC"};
final static String funFilename[ ] =
{ "open.gif", "nextpage.gif", "relative.gif",
"mouth.jpg", "vote_a.gif", ":MC"}; // : means not file
static { // do this when the class loaded
for(int i=0; i<=9; ++i) {
btnCMD1[i] = "" + i; // "0", "1", .. , "9"
}
btnCMD1[10] = "11 toggle"; // +/-
btnCMD1[11] = "12 dot"; // "12" for convinent to process
}
Frame f; // used in Application: a Window to host the Applet
Applet ap = null;
JButton bMyPic = null;
JButton bTaskMgr = null;
JTextField display = null;
JButton bWhoAmI = null;
CommandPad pLog = null; // to show the command
public Grid( ) { // Constructor, remember Grid extends Applet
if(ap==null) ap = this; // Let ap points to myself first
}
static private boolean isApplication = false; // Application or Applet
public static void main( String s[ ]) { // for Application only
isApplication = true; // to indicate that this is an Application
// an Applet will NOT run this main( ) function
Frame f = new Frame("Super Calculator 2008");
Grid a = new Grid( ); // new the Applet (simulate Browser)
f.add(a, BorderLayout.CENTER); // put the Applet in the Frame f
a.ap = a; // a.ap points to the Applet it self
a.f = f; // a.f points to the Frame f created in Application main()
a.init( ); // simulate Applet behavior
a.start( ); // simulate Applet behavior
/// resizing the window for fun
int szW[ ] = { 988, 58, 88, 888, 98, 108, 128, 149, 58, 28 };
int szH[ ] = { 58, 888, 666, 888, 18, 28, 38, 58, 16, 38 };
f.pack( );
f.setVisible(true); // necessary to show up
for(int i=0; i< szW.length; ++i) { // resize the window for fun
try {
try { Thread.sleep(368); } catch (InterruptedException e) {;}
f.setSize(WIDTH+ szW[i], HEIGHT+ szH[i]);
f.validate( );
printFrameSize(a);
if(szH[i]==888)
try { Thread.sleep(888); } catch (InterruptedException e) {;}
} catch(Exception e2) {;}
} // for
printf("======== Main program finish ========\n" );
} // main( ) ends here
static void printFrameSize(Applet a) {
printf("Current Applet size = " + a.getSize( ) +"\n" );
if(isApplication) // additional message for Application
printf(" Frame size = " + ((Grid)a).f.getSize( ) +"\n");
}
public void init( ) {
println("= = => init( ) is running...");
toolkit = Toolkit.getDefaultToolkit( ); // for later use
if(isApplication) {
WindowHandler chang3 = new WindowHandler( );
f.addWindowListener( chang3 );
}
Image myImage;
ImageIcon myIcon;;
JLabel labMyPic =
createLabelWithPicture("images/mypic.gif", CAPTION_LAB_MYPIC);
labMyPic.setForeground(COLOR_LAB_MYPIC);
bMyPic =
createButtonWithPicture("images/gigi.jpg", CAPTION_B_MYPIC);
//bMyPic.setEnabled(false); // 不准按這
bMyPic.setSize(58,58);
bMyPic.validate( );
bMyPic.updateUI();
bMyPic.setCursor( new Cursor(Cursor.HAND_CURSOR) );
///
Panel bigPan = new Panel( );
setLayout(new BorderLayout() );
add(bigPan, BorderLayout.CENTER);
Panel pDisp = new Panel( );
arrangeDisplay(pDisp); // use GridBagLayout to arrange display
add("North", pDisp); // then, put the panel on North side
///
display.setFont(DISPLAY_FONT);
display.setBackground(DISPLAY_BG_COLOR);
display.setForeground(DISPLAY_FG_COLOR);
///
bigPan.setLayout(new GridLayout(2,3));
bigPan.add(labMyPic); // my picture on a Label
bigPan.add(bMyPic); // pic on a Button
// //
Panel p3 = new Panel(new GridLayout(4,3));
layoutDigitsOnPanel(p3);
bigPan.add(p3);
Cursor csr2 = getMyCursor("images/point.gif");
for(int i=0; i <= 11; ++i) {
bDigits[i].setCursor( csr2 );
}
//
Panel tmpPan = new Panel(new GridLayout(2,1));
// put the following two components in a temp Panel
tmpPan.add( bTaskMgr = new JButton("Run Task Manager") );
tmpPan.add( pLog = new CommandPad() );
bigPan.add(tmpPan); // then, put the tmpPan into our bigPan
///
createFunButtons( ); // use funFilename[]
Panel p5 = new Panel( ); // prepare to use another GridBag
arrangeFunBoard(p5); // use GridBagLayout
bigPan.add(p5);
//
// Set ActionCommand for every Widget, Register to the ActionListener
setActionCommandAndListener(this);
bTaskMgr.addActionListener(this); // to invoke Taskmgr
bMyPic.addActionListener(this); // for fun
bWhoAmI = bFun[3]; // the Mouth
///
PicturePanel p6 = // PicturePanel is in MyApplet.java
new PicturePanel("images/funny.jpg", "照片 on Panel", true);
bigPan.add(p6); // put the picture into the bigPan with wantResize
setSize(WIDTH, HEIGHT); validate( );
setVisible(true);
} // init( )
void arrangeDisplay(Panel p) {
GridBagLayout gb = new GridBagLayout( ); // a manager
p.setLayout(gb); // GridBagLayout
GridBagConstraints c = new GridBagConstraints();
Label lab = new Label("超級計算器");
lab.setFont( new Font("Ludica Console", Font.BOLD, 24) );
lab.setForeground(Color.red);
/// set the Constraints
c.fill = GridBagConstraints.NONE;
c.weightx = 0.72;
c.gridheight = 1;
c.gridwidth = 1;
gb.setConstraints(lab, c);
p.add( lab );
display = new JTextField("Welcome to Disney World",DISPLAY_LENGTH);
displayLength = display.getColumns();
display.setCaretPosition( display.getText().length() ); // 游標
display.requestFocus( ); // display.requestFocusInWindow( );
c.fill = GridBagConstraints.BOTH;
c.gridwidth = 3; // hahaha
c.weightx = 3.98;
gb.setConstraints( display, c);
p.add(display);
JLabel tmp = new JLabel("帥吧");
tmp.setForeground( new Color(58, 168, 58) ); // light green
c.fill = GridBagConstraints.NONE;
c.weightx = 0.5;
c.gridwidth = GridBagConstraints.REMAINDER; // row end
gb.setConstraints( tmp, c);
p.add( tmp);
}
void layoutDigitsOnPanel(Panel p3) {
for(int i=1; i<=9; ++i) {
bDigits[i] = createButtonWithPicture("images/d"+i+".gif");
p3.add(bDigits[i]);
}
bDigits[0] = createButtonWithPicture("images/d"+0+".gif");
JButton bPlusMinus = new JButton("+/-");
bPlusMinus.setFont( new Font("Roman", Font.BOLD, 14) );
JButton bDot = new JButton("."); bDot.setFont(myFont24);
bDigits[10] = bPlusMinus;
bDigits[11] = bDot;
p3.add(bDigits[0]);
p3.add(bDigits[10]); // == bPlusMinus
p3.add(bDigits[11]); // == bDot
}
void createFunButtons( ) {
for(int i=0; i< bFun.length; ++i) {
if(funFilename[i].startsWith(":") ) {
bFun[i] = new JButton( funFilename[i].substring(1) ); // not file
continue;
} else
bFun[i] =
createButtonWithPicture("images/"+ funFilename[i] );
} //for
}
void arrangeFunBoard(Panel p) {
GridBagLayout gb = new GridBagLayout( ); // a manager
p.setLayout(gb); // GridBagLayout
GridBagConstraints c = new GridBagConstraints();
Font tmpFont = new Font("Ludica Console", Font.BOLD, 12) ;
Component component = null;
/// set the Constraints
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.gridheight = 1; c.gridwidth = 1;
gb.setConstraints(bFun[0], c);
p.add( bFun[0] );
c.gridwidth = GridBagConstraints.REMAINDER; // row end
gb.setConstraints(bFun[1], c);
p.add( bFun[1] );
c.weightx = 0.0; // reset
c.gridwidth = GridBagConstraints.REMAINDER; // row end
gb.setConstraints(bFun[2], c);
p.add( bFun[2] ); // on one row
c.weightx = 0.0; // reset
c.weighty = 1.0;
c.gridwidth = 1;
c.gridheight = 2; // 2 rows
//c.fill = GridBagConstraints.NONE;
gb.setConstraints(bFun[3], c);
p.add( bFun[3] );
///
c.weighty = 0.0; // reset
c.gridheight = 1;
//c.gridwidth = GridBagConstraints.LINE_END;
c.gridwidth = GridBagConstraints.REMAINDER; // row end
c.fill = GridBagConstraints.HORIZONTAL;
gb.setConstraints(bFun[4], c);
p.add( bFun[4] );
bFun[5].setFont(tmpFont);
c.fill = GridBagConstraints.BOTH;
gb.setConstraints(bFun[5], c);
p.add( bFun[5] );
}
void setActionCommandAndListener(ActionListener arbian ) {
// Set ActionCommand, and Register to the ActionListener pass to be
// for bDigits[ ]
for(int i=0; i < bDigits.length; ++i) {
bDigits[i].addActionListener( arbian );
bDigits[i].setActionCommand(btnCMD1[i]); // the associated Command
}
// for bFun[ ]
for(int i=0; i < bFun.length; ++i) {
bFun[i].addActionListener( arbian );
// also Register to the ActionListener
bFun[i].setActionCommand(btnCMDFun[i]);
}
}
/****
public void start( ) {
println("= = => > start( ) is running...");
}
*****/
public void stop( ) {
println("= = =< stop( ) is running...");
super.stop( );
}
public void repaint( ) {
println("- - - repaint( ) is called...");
super.repaint( );
}
public void update(Graphics g) {
println("- - - update(g) is called...");
super.update(g);
}
public void paint(Graphics g) {
println("- - - paint(g) is called...");
super.paint(g);
}
public void actionPerformed(ActionEvent ae) {
String cmd = ae.getActionCommand( );
Object who = ae.getSource( );
try {
print("Command = " +cmd ); // show on Console for Debug
//print(", by " + who); // which Component fire this event?
println("");
} catch (Exception e) {;}
if(who == bMyPic) {
changeColor(bMyPic); // for fun
try {
printFrameSize(ap);
playFile("images/laugh.au"); // make Laugh 大笑三聲
} catch (Exception e2) {;}
}
else if(who == bWhoAmI) { showWhoAmI( ); }
else if(who == bTaskMgr) { runTaskManager( ); }
processActionCommand(cmd, who);
} // actionPerformed
protected int displayLength = DISPLAY_LENGTH;
void processActionCommand(String cmd, Object who) {
/// Note: TextField will fire an ActionEvent when you hit ENTER
/// Your important to do jobs are here
int width = display.getSize().width; // the size of Display field
//displayLength = width / 12 - 1; // assume Font size is 24 = 12*2
displayLength = display.getColumns();
try {
showTextOnDisplay(cmd);
} catch (Exception e) {;}
try {
//pLog.writeLog(cmd + " "+width, who);
pLog.writeLog(cmd, who);
} catch (Exception e) {;}
} // processActionCommand
protected int textCursorPosition = 999;
void showTextOnDisplay(String cmd) {
int p = display.getCaretPosition( );
int cmdLength = cmd.length();
String t = display.getText();
cmd = t.substring(0, p) + cmd + t.substring(p);
textCursorPosition = p + cmdLength;
//cmd = " " + cmd ;
//int pos = cmd.length() - displayLength ; // RIGHT_ALIGNMENT
//display.setText( cmd.substring(pos) );
// cmd = cmd.substring(pos); // simulate RIGHT alignment
//
//display.updateUI(); // check?
int len = cmd.length();
display.setHorizontalAlignment(JTextField.RIGHT); // 靠右
/****
****/
display.setHorizontalAlignment(JTextField.RIGHT); // 靠右
display.setText( cmd );
display.setCaretPosition( textCursorPosition); // 游標維持正確
// no display.updateUI(); //?
display.requestFocus( ); // display.requestFocusInWindow( );
display.getParent().validate();
}
protected int visitChangeColor = 0; // set Red color at first time
void changeColor(Component obj) { // for fun
if(visitChangeColor++ == 0 ) {
obj.setBackground(Color.red); return;
}
Color c = obj.getBackground( );
int r = c.getRed( ), g = c.getGreen(), b = c.getBlue();
r = (int)(r+ 168*Math.random() ) %256;
g = (int)(r+ 168*Math.random() ) %256;
b = (int)(r+ 168*Math.random() ) %256;
obj.setBackground( new Color(r, g, b) );
}
void showWhoAmI( ) {
try {
display.setText( "tsaiwn@csie.nctu.edu.tw");
println("by 蔡文能 tsaiwn@csie.nctu.edu.tw") ;
} catch (Exception e) {;}
try {
playFile("images/welcome.wav");
Thread.sleep(568); // for your eye to see :-)
} catch (InterruptedException e) {;}
}
AudioClip song = null;
public AudioClip playFile(String filename) {
try { song = null;
if(isApplication) {
//URL base = newCodeBase();
//song = Applet.newAudioClip(new URL(base+filename));
song = newAudioBoth(filename);
} else {
//song = getAudioClip(getCodeBase(), filename); // Applet's
song = newAudioBoth(filename);
}
song.play( );
String status = "...Playing .." + filename;
try{ showStatus(status); } catch ( Exception es ) {;}
} catch (Exception e) {; } // ignore any error
return song;
}
//////////////
Cursor getMyCursor(String filename) {
if(isApplication) return createMyCursorBoth(filename);
else return createMyCursorBoth(filename);
//Image image = getImage(getCodeBase( ), filename); //for Applet
//return createMyCursor(image);
}
//an inner class to handle Window events
// inner class 的好處是它看得見 Global 變數, 不必傳參數就可以用
//這個 Handler 有能力處理部份 Window event
class WindowHandler extends WindowAdapter { // intead of WindowListener
public void windowClosing(WindowEvent e) {
if(!isApplication) return; // forget it
System.exit(0);
}
} // WindowHandler
} // class Grid
class CommandPad extends Panel {
String cmd = "";
Object who = null;
public CommandPad( ){
}
public void writeLog(String cmd, Object who) {
this.cmd = cmd;
this.who = who;
repaint( );
}
public void paint(Graphics g) {
int xpos = 8, ypos = 78;
g.setColor(Color.red);
try {
ypos = getSize().height - 16;
}catch(Exception e) {;}
g.drawString("請開 Java 主控台看看", xpos, ypos);
g.drawString("Got your ActionCommand:", 8,16);
g.drawString(cmd, 58,28);
if(who != null) g.drawString("by "+ who, 8,49);
}
}