2015年10月19日 星期一

JAVA SL-275_10/18

JAVA SL-275_10/18
Date: 10/18
//============================================================//
常用的 Java 圖形 Lib (java 7.0 版以後,兩種可以混用):
AWT
Swing

一般功能表是由三種類別所建立:
MenuBar
Menu
MenuItem

java.lang.Object

java.awt.MenuComponent → java.awt.MenuBar
java.awt.MenuComponent → java.awt.MenuItem ─ java.awt.Menu


設計的參數及概念:

監聽事件 (event listener) 架構圖:

//============================================================//
//app_1.java
import java.awt.*;
import java.awt.event.*;

public class app_1 extends Frame implements ActionListener{
 static app_1 frm=new app_1();
 static Button btn1=new Button("Yellow");
 static Button btn2=new Button("Green");
 static Button btn3=new Button("Exit");
 public static void main(String args[]){
  btn1.addActionListener(frm);
  btn2.addActionListener(frm);
  btn3.addActionListener(frm);
  frm.setTitle("ActionEvent");
     frm.setLayout(new FlowLayout(FlowLayout.CENTER));
     frm.setSize(300,200);
     frm.add(btn1);
     frm.add(btn2);
     frm.add(btn3);
     frm.setVisible(true); //一定要show出,不然無法顯示。
     frm.addWindowListener(new WindowAdapter(){  //視窗右上角x功能
      public void windowClosing(WindowEvent e){
       System.exit(0);
      }
     });
 }
 public void actionPerformed(ActionEvent e){
  Button btn=(Button)e.getSource();//取得事件來源物件。
  if(btn==btn1)
   frm.setBackground(Color.YELLOW);
  if(btn==btn2)
   frm.setBackground(Color.GREEN);
  if(btn==btn3)
   System.exit(0);
 }

}
//============================================================//
//app_2.java
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.*;
import java.awt.event.*;
public class app_2 extends Frame implements ItemListener{
 static app_2 frm=new app_2();
 static Checkbox ckb1=new Checkbox("Java");
 static Checkbox ckb2=new Checkbox("PHP");
 static Label lab=new Label("Select one");
 public static void main(String args[]){
  CheckboxGroup grp=new CheckboxGroup();
  frm.setSize(300,200);
  frm.setTitle("app_2 Programmer");
  frm.setLayout(new FlowLayout(FlowLayout.CENTER));
  ckb1.setCheckboxGroup(grp);
  ckb2.setCheckboxGroup(grp);
  lab.setBackground(Color.orange);
  ckb1.addItemListener((ItemListener) frm);
  ckb2.addItemListener((ItemListener) frm);
  frm.add(ckb1);
  frm.add(ckb2);
  frm.add(lab);
  frm.setVisible(true);
  frm.addWindowListener(new WindowAdapter(){  //視窗右上角x功能
      public void windowClosing(WindowEvent e){
       System.exit(0);
      }
     });
 }
 @Override
 public void itemStateChanged(ItemEvent e) {
  if(ckb1.getState()==true)
   lab.setText("Java");
  else if(ckb2.getState()==true)
   lab.setText("PHP");
  
 }
}
//============================================================//
//app3.java
import java.awt.*;
import java.awt.event.*;

public class app3 extends Frame implements ActionListener{
 static app3 frm=new app3();
 static Label lab=new Label("Hellow JAVA",Label.CENTER);
 static MenuBar mb=new MenuBar();
 static Menu menu1=new Menu("Style");
 static Menu menu2=new Menu("Exit");
 static MenuItem mi1=new MenuItem("plane");
 static MenuItem mi2=new MenuItem("bold");
 static MenuItem mi3=new MenuItem("italic");
 static MenuItem mi4=new MenuItem("close window");
 
 //Dialog --> 要呼叫 show() method 才可以顯示
 static Button close_btn=new Button("Close");
 static Button cancel_btn=new Button("Cancel");
 static Dialog dlg=new Dialog(frm);
 static WinLis wlis=new WinLis();
 
 public static void main(String args[]){
  mb.add(menu1);
  mb.add(menu2);
  menu1.add(mi1);
  menu1.add(mi2);
  menu1.add(mi3);
  menu2.add(mi4);
  mi1.addActionListener(frm);
  mi2.addActionListener(frm);
  mi3.addActionListener(frm);
  mi4.addActionListener(frm);
  lab.setFont(new Font("Dialog",Font.PLAIN,24));
  frm.add(lab);
  frm.setSize(280,150);
  frm.setTitle("app_3 Programmer");
  frm.setMenuBar(mb);
  frm.setVisible(true);
 
  dlg.setTitle("Are you sure?");
  dlg.setSize(140,100);
  dlg.setLayout(new FlowLayout(FlowLayout.CENTER,5,30));
  dlg.add(close_btn);
  dlg.add(cancel_btn);
  close_btn.addActionListener(frm);
  cancel_btn.addActionListener(frm);
  frm.addWindowListener(wlis);
  
  
  
  /*frm.addWindowListener(new WindowAdapter(){  //視窗右上角x功能
      public void windowClosing(WindowEvent e){
       System.exit(0);
      }
     });*/
 }
 
 static class WinLis extends WindowAdapter{
  public void windowClosing(WindowEvent e){
   dlg.setLocation(80, 30);
   dlg.show();
  }
 }
 
 
 @Override
 public void actionPerformed(ActionEvent e) {
  //MenuItem mi=(MenuItem)e.getSource();
  if(e.getSource()==mi1)
   lab.setFont(new Font("Dialog",Font.PLAIN,30));
  else if(e.getSource()==mi2)
   lab.setFont(new Font("Dialog",Font.BOLD,30));
  else if(e.getSource()==mi3)
   lab.setFont(new Font("Dialog",Font.ITALIC,30));
  else if(e.getSource()==mi4)
   frm.dispose();//關閉式窗
     
  //Button btn=(Button)e.getSource();
  else if(e.getSource()==close_btn){
   dlg.dispose();
   frm.dispose();
  }
  else if(e.getSource()==cancel_btn){
   dlg.hide(); //隱藏
  }
 }
}
//============================================================//

2015年10月5日 星期一

JAVA SL-275_10/04

JAVA SL-275_10/04
Date: 10/04

List
作用是收集物件,並以索引益式保留收集的物件順序。
ArrayList
在陣列中的排序使用可以得到較快的速度,
如果是需要調整索引順序時,則會有較差的表現。

LinkedList
在實作 List 介面時,採用了 (Link) 結構。
first > Object  > Object  > Object
next   next   next
Node   Node   Node
如果要指定索引隨機存取物件時,不建議用 LinkedList,其每次存取都會從頭 (first ) 開始,
但若只是調整索引順序,從還是可以使用 LinkedList。
//================================================================//
支援佇列操作的 Queue
繼承自 Collection,所以它也具有 Collection 的 add(), remove(), element() 等方法。
一操作失敗時,會拋出例外

Queue 定義了自己的 offer(), poll(), pee,() 等方法。
一操作失敗時會傳回特定值

offer() 用來在佇列後端加入物件
 成功→True, 失敗→false

poll() 取出佇列前端物件,若佇列為空則傳回 null.

peek() 取得(但不取出)佇列前端物件,若佇列為空則傳回 null.
//================================================================//
想對佇列的前端與尾端進行操作,在前端加入物件與取出物件,在尾端加入與取出物件, Queue 的子介面 Deque 就定義了這類行為。

addFirst(), removeFirst(), getFirst().
addLast(), removeLast(), getLast().
操作失敗時會傳回例外

offerFirst(), pollFirst(), peekFirst().
offerLast(), pollLast(), peekLast().
操作物敗時會傳回特定值
//================================================================//
排序收集的物件
java.util.Collection 提供有 sort() 方法,由於必須有索引才能進行排序,
因此 Collection 的 sort() 方法接受 List 實作的物件。

//================================================================//

//================================================================//
//MapDemo.java
import java.util.*;


public class MapDemo {
 public static void main(String args[]){
  HashMap t = new HashMap();
  t.put("A", "SCJP");
  t.put(new Integer(100),new Integer(200));
  t.put(new Object(),"SCBCD");
  t.put(null, null);
  System.out.println(t.toString());
  System.out.println("keyA:"+t.get("A"));
  System.out.println("keyB:"+t.get("B"));
 }
}
//================================================================//
//取間值
import java.util.*;
import java.util.Map.Entry;

public class MapkeyValue {
 public static void main(String args[]){
  Map<String,String> map = new TreeMap<>();
  map.put("one","一");
  map.put("two","二");
  map.put("three","三");
  foreach(map.entrySet());
  }
 private static void foreach(Iterable<Map.Entry<String,String>>iterable){
   for(Map.Entry<String, String> entry:iterable){
    System.out.printf("鑑%s 值%s %n", entry.getKey(), entry.getValue());
  }
 }
}
//================================================================//
//Message.java
import java.util.Map;
import java.util.Scanner;
import java.util.*;

public class Messages {
 public static void main(String args[]){
  Map<String,String> messages = new HashMap<>();
  messages.put("Justin","Hello Justin的訊息");
  messages.put("Monic","給Monic的禮物");
  messages.put("Irene","Irene的喵喵叫");
  Scanner scanner = new Scanner(System.in);
  System.out.print("取得誰的訊息");
  String str = messages.get(scanner.nextLine());
  System.out.println(str);
  System.out.println(messages);
 }
}
//================================================================//
//NewClass.java
import java.util.*;

public class NewClass {
 public static void main(String args[]){
  Queue q = new LinkedList();
  q.offer("First");
  q.offer("Second");
  q.offer("Third");
  Object o;
  System.out.println(q.toString());
  
/*  while((o = q.poll()) != null){
   String s = (String)o;
   System.out.print(s+" ");
  }*/
  while((o = q.peek()) != null){  //跑無窮迴圈
   String s = (String)o;
   System.out.print(s+" ");
   q.remove(); 
  }
  System.out.println(q.toString());
 }
}

//================================================================//
//QueueDemo.java
import java.util.*;

public class QueueDemo {
 public static void main(String args[]){
  Queue<String> q = new LinkedList<String>();
  q.offer("SCJP");
  q.offer("SCWCD");
  q.offer("SCBCD");
  System.out.println(q.toString()+" ");
  Iterator a = q.iterator();
  while(a.hasNext()){
   String s = (String)a.next();
   System.out.print(s+" ");
  }
 }

}
//================================================================//
//RequestQueue.java
import java.util.*;

interface Request{
 void execute();
}


public class RequestQueue {
 public static void main(String args[]){
  Queue requests = new LinkedList();
  //模擬請求加入佇列
  for(int i=1;i<6 execute="" i="" math.random="" n="" new="" null="" pre="" private="" process="" public="" request.execute="" request="(Request)requests.poll();" requests.offer="" requests.peek="" requests="" s="" static="" system.out.printf="" ueue="" void="" while="">
//================================================================//

練習:
Link.java、LinkDemo.java、SimpleLinkedList.java

//Link.java.java

class Link{
 private class Node{
  Object o;
  Node next;
  Node(Object o){
   this.o=o;
  }
 }
 
 private Node first;
 
 public void add(Object o){
  Node last;
  
  if(first==null){
   first=new Node(o);
  }
  else{
   last=first;
   while(last.next!=null){
    last=last.next;
   }
   last.next=new Node(o);
  }
 }
 
 public Object get(int index){
  int size=size();
  if(index>=size){
   throw new IndexOutOfBoundsException(String.format("Index:%d, size:%d",index,size));
  }
  int count=0;
  Node last=first;
  while(count<index){
   last=last.next;
   count++;
  }
  return last.o;
 }
 
 public int size(){
  if(first==null)
   return 0;
  
  Node last=first;
  int count=1;
  while(last.next!=null){
   last=last.next;
   count++;
  }
  return count;
 }
}
//LinkDemo.java
public class LinkDemo {
 public static void main(String args[]){
  Link l = new Link();
  String s0 = "hello-0";
  String s1 = "hello-1";
  String s2 = "hello-2";
  String s3 = "hello-3";
  l.add(s0);
  l.add(s1);
  l.add(s2);
  l.add(s3);
  System.out.println(l.size());
  System.out.println((String)l.get(3));
  System.out.println((String)l.get(0));
 }

}
//SimpleLinkedList.java
public class SimpleLinkedList {
 private class Node{
  //將收集的物件用/vode封裝
  Node(Object o){  
   this.o=o;
  }
  Object o;
  Node next;
 }
 private Node first; //第一個節點
 public void add(Object o){ //新增一個Node封裝物件,並由上一個o Node物件參考
  if(first == null){
   first=new Node(o);
  }
  else{
   Node last = first;
   while(last.next != null){
    last=last.next;
   }
   last.next=new Node(o);
  }
 }
 public int size(){ //走訪所有Node計數並取得長度
  int count=0;
  Node last=first;
  while(last.next != null){
   last=last.next;
   count++;
  }
  return count;
 }
  public Object get(int index){ //走訪所有Node計數並取得對應索引順序
   int size=size();
   if(index > size){
    throw new IndexOutOfBoundsException(
      String.format("Index: %d,Size: %d", index, size));
   }
 
  int count=0;
  Node last=first;
  while(count < index){
   last=last.next;
   count++;
  }
  return last.o;
 }
}
//================================================================//
import java.util.*;
class Account implements Comparable{
 private String name;
 private String number;
 private int balance;
 Account(String name,String number,int balance){
  this.name=name;
  this.number=number;
  this.balance=balance;
 }
 public String toString(){
  return String.format("Account(%s %s %d)",name,number,balance);
 }
 
 public int comparTo(Object o){
  Account other=(Account)o;
  return this.balance-other.balance;
 }
 @Override
 public int compareTo(Object o) {
  // TODO Auto-generated method stub
  return 0;
 }
}
public class Sort2 {
 public static void main(String arg[]){
  List accounts=Arrays.asList(
  new Account("Justin","x1234",1000),
  new Account("Monic","x5678",500),
  new Account("Irene","x2345",100)
  );
  Collections.sort(accounts);
  System.out.println(accounts);
 }
}
//================================================================//
//Stack.java
import java.util.*;

public class Stack {
 private Deque deque = new ArrayDeque();
 private int capacity;
 public Stack(int capacity){
  this.capacity=capacity;
 }

 public boolean push (Object o){
  if(deque.size()+1 > capacity){
   return false;
  } 
  return deque.offerLast(o);
 }
 public Object pop( ){
  return deque.pollLast();
 }
 public Object peek(){
  return deque.peekLast();
 }
 public int size(){
  return deque.size();
 }
 public static void main(String args[]){
  Stack stack = new Stack(4);
  stack.push("Justin");
  stack.push("Lisa");
  stack.push("John");
  System.out.println(stack.pop());
  System.out.println(stack.peek());
  System.out.println(stack.size());
 }
}
//================================================================//