Monday, July 15, 2013

Java24h h13-h17 GUI (Java)

0) If you are using firefox or chrome, please install jre 32bit to run applet!
1) Swing (GUI)
  • Container: Window & Frame JFrame, FlowLayout (java.awt), and JPanel
  • Component: JButton, JLabel, JTextField, JCheckBox, ButtonGroup, JComboBox, JTextArea, JPanel
at first: call a constructor
  • title: super("title"); or setTitle("title");
  • size: setSize(wide,tall); or pack();
  • look and feel: UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); (put this in try-catch)
  • setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  • setVisible(true);
class Playback and class ClockPanel
import javax.swing.*;

import java.awt.*;

public class Playback extends JFrame {
public Playback() {
super("Playback");
setLookAndFeel();
setSize(400, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Layout
FlowLayout flo = new FlowLayout();
setLayout(flo);
//Buttons
JButton play = new JButton("Play");
JButton stop = new JButton("Stop");
JButton pause = new JButton("Pause");
add(play);
add(stop);
add(pause);
//Label and Text field
JLabel pageLabel = new JLabel("Web page address: ", JLabel.CENTER);
JTextField pageAddress = new JTextField("http://www.java24hours.com",20);
JTextField country = new JTextField("US", 20);
add(pageLabel);
add(pageAddress);
add(country);
country.setText("Separate Customs Territory of Taiwan, Penghu, Kinmen, " +
"and Matsu");
//Check Box
JCheckBox jumboSize = new JCheckBox("Jumbo Size", true);
add(jumboSize);
//ButtonGroup
JCheckBox frogLegs = new JCheckBox("Frog Leg Grande", true);
JCheckBox fishTacos = new JCheckBox("Fish Taco Platter", false);
JCheckBox emuNuggets = new JCheckBox("Emu Nuggets", false);
ButtonGroup meals = new ButtonGroup();
meals.add(frogLegs);
meals.add(fishTacos);
meals.add(emuNuggets);
add(frogLegs);
add(fishTacos);
add(emuNuggets);
//Combo Box
JComboBox profession = new JComboBox();
profession.addItem("Butcher");
profession.addItem("Baker");
profession.addItem("Candlestick maker");
profession.addItem("Fletcher");
profession.addItem("Fighter");
profession.addItem("Technical writer");
profession.setEditable(true);
add(profession);
//Text Area
JTextArea comments = new JTextArea("I should have been a pair\n " +
"of ragged claws.", 3, 25);
add(comments);
//Panel
JPanel topRow = new JPanel();
add(topRow);
//ClockPanel 
ClockPanel time = new ClockPanel();
add(time);
setVisible(true);
}

private void setLookAndFeel() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
);
catch (Exception exc) {
//ignore error
}
}

public static void main(String[] arguments) {
Playback pb = new Playback();
}
}
 import javax.swing.*;
import java.util.*;

public class ClockPanel extends JPanel {
public ClockPanel() {
super();
String currentTime = getTime();
JLabel time = new JLabel("Time: ");
JLabel current = new JLabel(currentTime);
add(time);
add(current);
}

final String getTime() {
String time;
// get current time and date
Calendar now = Calendar.getInstance();
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int month = now.get(Calendar.MONTH) + 1;
int day = now.get(Calendar.DAY_OF_MONTH);
int year = now.get(Calendar.YEAR);

String monthName = "";
switch (month) {
case (1):
monthName = "January";
break;
case (2):
monthName = "February";
break;
case (3):
monthName = "March";
break;
case (4):
monthName = "April";
break;
case (5):
monthName = "May";
break;
case (6):
monthName = "June";
break;
case (7):
monthName = "July";
break;
case (8):
monthName = "August";
break;
case (9):
monthName = "September";
break;
case (10):
monthName = "October";
break;
case (11):
monthName = "November";
break;
case (12):
monthName = "December";
}
time = monthName + " " + day + ", " + year + " "
+ hour + ":" + minute;
return time;
}
}
 2) containers and components

  • The size of container
  • The size of other components and contatiners
  • The layout manager that being used
2.1) layout managers
  • FlowLayout (java.awt): 线性排列→↓FlowLayout flo = new FlowLayout();
  • GridLayout (java.awt): 网格排列GridLayout grid = new  GridLayout(2,3);
  • BorderLayout (java.awt): 方位排列
BorderLayout  border = new BorderLayout();
setLayout(border);
add (component, BoderLayout.NORTH[SOUTH,EAST,WEST,CENTER]);
  • BoxLayout: (java.swing): 线性排列↓
JPanel pane = new JPanel();
BoxLayout box = new BoxLayout (pane, BoxLayout.Y_AXIS[X_AXIS]);
pane.setLayout(box);
pane.add(component1);
pane.add(component2);
2.1) Insets (java.awt): compoents间距
override container's getInsets();
public Insets getInsets(){
 Insets around = new Insets(top, left, bottom, right);
 return around;
}
class KeyViewer:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class KeyViewer extends JFrame implements KeyListener {
JTextField keyText = new JTextField(80);
JLabel keyLabel = new JLabel("Press any key in the text field.");

KeyViewer() {
super("KeyViewer");
setLookAndFeel();
setSize(350, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
keyText.addKeyListener(this);
BorderLayout bord = new BorderLayout();
setLayout(bord);
add(keyLabel, BorderLayout.NORTH);
add(keyText, BorderLayout.CENTER);
setVisible(true);
}

public void keyTyped(KeyEvent input) {
// input can be letters, numbers, or punctuation, including Backspace
char key = input.getKeyChar();

// only showing the currently pressed key.
keyLabel.setText("You pressed " + key); 

/* for practice, showing the content in keyText

String label = keyLabel.getText();
label = label.replaceAll("You pressed ", "");
int l = label.length();
label = label.replaceAll("Press any key in the text field.", "");

if (key == KeyEvent.VK_BACK_SPACE){
// Backspace
if (l!=0){
label = label.substring(0,l-1);
}
}
else {
label = label + key;
}

// when we use mouse to delete more than one character.
// actually, we can directly use label = keyText.getText();
if (keyText.getText().length()==0){
label = "";
}

keyLabel.setText("You pressed " + label);
*/
}

public void keyPressed(KeyEvent txt) {
// do nothing
}

public void keyReleased(KeyEvent txt) {
// do nothing
}

private void setLookAndFeel() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
);

catch (Exception exc) {
// ignore error
}
}

public static void main(String[] arguments) {
KeyViewer frame = new KeyViewer();
}
}
class LottotMadness:
import java.awt.*;
import javax.swing.*;

public class LottoMadness extends JFrame {
LottoEvent lotto = new LottoEvent(this);
// set up row 1
JPanel row1 = new JPanel();
ButtonGroup option = new ButtonGroup();
JCheckBox quickpick = new JCheckBox("Quick Pick", false);
JCheckBox personal = new JCheckBox("Personal", true);
// set up row 2
JPanel row2 = new JPanel();
JLabel numbersLabel = new JLabel("Your picks: ", JLabel.RIGHT);
JTextField[] numbers = new JTextField[6];
JLabel winnersLabel = new JLabel("Winners: ", JLabel.RIGHT);
JTextField[] winners = new JTextField[6];
// set up row 3
JPanel row3 = new JPanel();
JButton stop = new JButton("Stop");
JButton play = new JButton("Play");
JButton reset = new JButton("Reset");
// set up row 4
JPanel row4 = new JPanel();
JLabel got3Label = new JLabel("3 of 6: ", JLabel.RIGHT);
JTextField got3 = new JTextField("0");
JLabel got4Label = new JLabel("4 of 6: ", JLabel.RIGHT);
JTextField got4 = new JTextField("0");
JLabel got5Label = new JLabel("5 of 6: ", JLabel.RIGHT);
JTextField got5 = new JTextField("0");
JLabel got6Label = new JLabel("6 of 6: ", JLabel.RIGHT);
JTextField got6 = new JTextField("0", 10);
JLabel drawingsLabel = new JLabel("Drawings: ", JLabel.RIGHT);
JTextField drawings = new JTextField("0");
JLabel yearsLabel = new JLabel("Years: ", JLabel.RIGHT);
JTextField years = new JTextField();

public LottoMadness() {
super("Lotto Madness");
setLookAndFeel();
setSize(550, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout layout = new GridLayout(5, 1, 10, 10);
setLayout(layout);

// Add listeners
quickpick.addItemListener(lotto);
personal.addItemListener(lotto);
stop.addActionListener(lotto);
play.addActionListener(lotto);
reset.addActionListener(lotto);

FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER,
10, 10);
option.add(quickpick);
option.add(personal);
row1.setLayout(layout1);
row1.add(quickpick);
row1.add(personal);
add(row1);

GridLayout layout2 = new GridLayout(2, 7, 10, 10);
row2.setLayout(layout2);
row2.add(numbersLabel);
for (int i = 0; i < 6; i++) {
numbers[i] = new JTextField();
row2.add(numbers[i]);
}
row2.add(winnersLabel);
for (int i = 0; i < 6; i++) {
winners[i] = new JTextField();
winners[i].setEditable(false);
row2.add(winners[i]);
}
add(row2);

FlowLayout layout3 = new FlowLayout(FlowLayout.CENTER,10, 10);
row3.setLayout(layout3);
stop.setEnabled(false);
row3.add(stop);
row3.add(play);
row3.add(reset);
add(row3);

GridLayout layout4 = new GridLayout(2, 3, 20, 10);
row4.setLayout(layout4);
row4.add(got3Label);
got3.setEditable(false);
row4.add(got3);
row4.add(got4Label);
got4.setEditable(false);
row4.add(got4);
row4.add(got5Label);
got5.setEditable(false);
row4.add(got5);
row4.add(got6Label);
got6.setEditable(false);
row4.add(got6);
row4.add(drawingsLabel);
drawings.setEditable(false);
row4.add(drawings);
row4.add(yearsLabel);
years.setEditable(false);
row4.add(years);
add(row4);

setVisible(true);
}

private void setLookAndFeel() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
);

catch (Exception exc) {
// ignore error
}
}

public static void main(String[] arguments) {
LottoMadness frame = new LottoMadness();
}
}
 3) Listener
  • import java.awt.event.*
  • public class Graph implements ActionListener, MouseListener
  • component.addActionListener(this)
  • public void actioniPerformed(ActionEvent event){};
  • Check Box and ComboBox Events: ItemListener
  • Keyboard Events: KeyListener
  • Enabling and Disabling: setEnabled(true|false);
class LottoEvent
import javax.swing.*;
import java.awt.event.*;

public class LottoEvent implements ItemListener, ActionListener, Runnable {

LottoMadness gui;
Thread playing;

public LottoEvent(LottoMadness in) {
gui = in;
}

public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
if (command.equals("Play")) {
startPlaying();
}
if (command.equals("Stop")) {
stopPlaying();
}
if (command.equals("Reset")) {
clearAllFields();
gui.personal.setSelected(true);//debug 01: set quickpick unselected when click Reset.
}
}

void startPlaying() {
playing = new Thread(this);
// debug 02: run the game even when there is/are empty number(s) by quickpick.
if (numberCheckEmpty(gui.numbers)) {
gui.personal.doClick();
gui.quickpick.doClick();
}
playing.start();
gui.play.setEnabled(false);
gui.stop.setEnabled(true);
gui.reset.setEnabled(false);
gui.quickpick.setEnabled(false);
gui.personal.setEnabled(false);
}

void stopPlaying() {
gui.stop.setEnabled(false);
gui.play.setEnabled(true);
gui.reset.setEnabled(true);
gui.quickpick.setEnabled(true);
gui.personal.setEnabled(true);
playing = null;
}

void clearAllFields() {
for (int i = 0; i < 6; i++) {
gui.numbers[i].setText(null);
gui.winners[i].setText(null);
}
gui.got3.setText("0");
gui.got4.setText("0");
gui.got5.setText("0");
gui.got6.setText("0");
gui.drawings.setText("0");
gui.years.setText("0");
}

public void itemStateChanged(ItemEvent event) {
Object item = event.getItem();
if (item == gui.quickpick) {
for (int i = 0; i < 6; i++) {
int pick;
do {
pick = (int) Math.floor(Math.random() * 50 + 1);
} while (numberGone(pick, gui.numbers, i));
gui.numbers[i].setText("" + pick);
}

else {
for (int i = 0; i < 6; i++) {
gui.numbers[i].setText(null);
}
}
}

void addOneToField(JTextField field) {
int num = Integer.parseInt("0" + field.getText());//// it is very necessary to add "0" ?
num++;
field.setText("" + num);
}

boolean numberGone(int num, JTextField[] pastNums, int count) {
for (int i = 0; i < count; i++) {
if (Integer.parseInt(pastNums[i].getText()) == num) {
return true;
}
}
return false;
}

// debug 02: run the game even when there is/are empty number(s) by quickpick.
boolean numberCheckEmpty(JTextField[] number) {
int i = 0;
while (i < 6) {
if (number[i].getText().isEmpty()) {
return true;
}
i++;
}
return false;
}

boolean matchedOne(JTextField win, JTextField[] allPicks) {
for (int i = 0; i < 6; i++) {
String winText = win.getText();
if ( winText.equals( allPicks[i].getText() ) ) {
return true;
}
}
return false;
}

public void run() {
Thread thisThread = Thread.currentThread();
while (playing == thisThread) {
addOneToField(gui.drawings);
int draw = Integer.parseInt(gui.drawings.getText());
float numYears = (float)draw / 104;
gui.years.setText("" + numYears);

int matches = 0;
for (int i = 0; i < 6; i++) {
int ball;
do {
ball = (int) Math.floor(Math.random() * 50 + 1);
} while (numberGone(ball, gui.winners, i));
gui.winners[i].setText("" + ball);
if (matchedOne(gui.winners[i], gui.numbers)) {
matches++;
}
}
switch (matches) {
case 3:
addOneToField(gui.got3);
break;
case 4:
addOneToField(gui.got4);
break;
case 5:
addOneToField(gui.got5);
break;
case 6:
addOneToField(gui.got6);
gui.stop.setEnabled(false);
gui.play.setEnabled(true);
playing = null;
}
try {
Thread.sleep(100);

catch (InterruptedException e) {
// do nothing
}
}
}
}
4) Scroll Panes
JScroolPane()|(int, int)|(component)|(component, int, int)|
(component, JScrollPane.VERTICAL[|HORIZONTAL]_SCROLLBAR_ALWAYS[|NERVER|ALWAYS])

class MailWriter()
import javax.swing.*;
import java.awt.*;

public class MailWriter extends JFrame {

public MailWriter() {
super("Write an E-Mail");
setLookAndFeel();
setSize(370, 270);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout flow = new FlowLayout(FlowLayout.RIGHT);
setLayout(flow);

JPanel row1 = new JPanel();
JLabel toLabel = new JLabel("To:");
row1.add(toLabel);
JTextField to = new JTextField(24);
row1.add(to);
add(row1);

JPanel row2 = new JPanel();
JLabel subjectLabel = new JLabel("Subject:");
row2.add(subjectLabel);
JTextField subject = new JTextField(24);
row2.add(subject);
add(row2);

JPanel row3 = new JPanel();
JLabel messageLabel = new JLabel("Message:");
row3.add(messageLabel);
JTextArea message = new JTextArea(4, 22);
//the aim of these two command lines is to wrap.
message.setLineWrap(true);
message.setWrapStyleWord(true);
//***********************************
JScrollPane scroll = new JScrollPane(message,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
);
row3.add(scroll);
add(row3);

JPanel row4 = new JPanel();
JButton send = new JButton("Send");
row4.add(send);
add(row4);

setVisible(true);
}

private void setLookAndFeel() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
);

catch (Exception exc) {
// ignore error
}
}

public static void main(String[] arguments) {
MailWriter mail = new MailWriter();
}
}
5) Sliders
JSliders()|(min, max)|(min,max,start)
.VERTICAL[|HORIZONTAL]
.setMajorTickSpacing(int)
.setMinorTickSpacing(int)
.setPaintTicks(boolean)
.setPaintLabels(boolean)

ChangeListener

class ColorSlider()


import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;

public class ColorSliders extends JFrame implements ChangeListener {
ColorPanel canvas;
JSlider red;
JSlider green;
JSlider blue;

public ColorSliders() {
super("Color Slide");
setLookAndFeel();
setSize(270, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

canvas = new ColorPanel();
red = new JSlider(0, 255, 255);
green = new JSlider(0, 255, 0);
blue = new JSlider(0, 255, 0);

red.setMajorTickSpacing(50);
red.setMinorTickSpacing(10);
red.setPaintTicks(true);
red.setPaintLabels(true);
red.addChangeListener(this);

green.setMajorTickSpacing(50);
green.setMinorTickSpacing(10);
green.setPaintTicks(true);
green.setPaintLabels(true);
green.addChangeListener(this);

blue.setMajorTickSpacing(50);
blue.setMinorTickSpacing(10);
blue.setPaintTicks(true);
blue.setPaintLabels(true);
blue.addChangeListener(this);

JLabel redLabel = new JLabel("Red: ");
JLabel greenLabel = new JLabel("Green: ");
JLabel blueLabel = new JLabel("Blue: ");
GridLayout grid = new GridLayout(4, 1);
FlowLayout right = new FlowLayout(FlowLayout.RIGHT);
setLayout(grid);

JPanel redPanel = new JPanel();
redPanel.setLayout(right);
redPanel.add(redLabel);
redPanel.add(red);
add(redPanel);

JPanel greenPanel = new JPanel();
greenPanel.setLayout(right);
greenPanel.add(greenLabel);
greenPanel.add(green);
add(greenPanel);

JPanel bluePanel = new JPanel();
bluePanel.setLayout(right);
bluePanel.add(blueLabel);
bluePanel.add(blue);
add(bluePanel);
add(canvas);
setVisible(true);
}

public void stateChanged(ChangeEvent event) {
JSlider source = (JSlider) event.getSource();
if (source.getValueIsAdjusting() != true) {
Color current = new Color(red.getValue(),green.getValue(),blue.getValue());
canvas.changeColor(current);
canvas.repaint();
}
}

public Insets getInsets() {
Insets border = new Insets(45, 10, 10, 10);
return border;
}

private void setLookAndFeel() {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
);

catch (Exception exc) {
// ignore error
}
}

public static void main(String[] arguments) {
ColorSliders cs = new ColorSliders();
}
}

class ColorPanel extends JPanel {
Color background;

ColorPanel() {
background = Color.red;
}
// paint "The current Color object" ********
public void paintComponent(Graphics comp) {
Graphics2D comp2D = (Graphics2D) comp;
comp2D.setColor(background);
comp2D.fillRect(0, 0, getSize().width, getSize().height);
}
//******************************************
void changeColor(Color newBackground) {
background = newBackground;
}
}
6) Image Icons and Toolbars
ImageIcon imageIcon = new ImageIcon(fileName);
Only for gif, jpeg, png.

7) java API
http://docs.oracle.com/javase/7/docs/api/ 

8) JApplet
  • init(); start(); 
  • paint(); 
  • stop();
  • start();
  • destroy();
<applet code=” .class”  codebase=”javadir” height=”300”
width=”400”>
<p>Sorry, no   dice ... this  requires a Java-enabled browser.</p>
</applet>

LottoMadness.html and WeightScale.html 运行不了!
应当如此设置,加不加引号无所谓:
<object type="application/x-java-applet">
<param name="code" value="java24h13to17GUI.WeightScale" />
<param name="codebase" value="../../bin/" />
<p>Sorry, no dice ... this requires a Java-enabled browser.</p>
</object>
or
<applet 
code=java24h18to24.LinkRotator.class 
codebase=../../bin/ 
width="200" height="200"
>
</applet>

No comments:

Post a Comment