恬然自得.活在當下: [功課]Java Swing練習CheckBox

2011年5月31日 星期二

[功課]Java Swing練習CheckBox

同樣是一個差別度不大的功課,讓同學練習用一下CheckBox,只要使用isSelected就可以判斷CheckBox是否有被按下,另外CheckBox也有另一個監聽事件itemStateChanged,當按鈕發生變化時就會觸發,各位同學可以利用這個事件來發揮出更多不同的創意唷。
 
筆者自己初學Swing時,也都是看Java的官方文件,如果有還不知道的同學,趕快上去看看,先把上面介紹的元件都基本摸熟了,那你要考期末考應該是沒問題了XD不過這對於有興趣了解Swing的同學應該是不足的,這個時候真的要多去看一些書,就可以學到其他作者的想法,以後有東西會繼續跟大家分享。
http://download.oracle.com/javase/tutorial/uiswing/components/index.html

按下「Launch」鈕,可直接操縱此次功課的程式,歡迎試試看唷!
P.S.家裡用IE可以成功執行。



執行結果:



底下分享我自己寫的部分,另外也歡迎平時有光顧我網誌的讀者,可以在底下留言自己的寫法。^-^

寫法僅供參考,畢竟Java才學不到一年吧 >”<
(大家記得註解和程式碼要自己重新打過唷,工讀生會檢查;變數名稱和註解內容記得也要修改掉唷)
程式碼:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


@SuppressWarnings("serial")
public class a11967046 extends JFrame implements ActionListener{
 
 /* s11967046   公版  
  *  請設計一個Swing應用程式來計算計程車的車資。
  *  1. JTextField可以輸入里程數。 
  *  2. JCheckBox元件勾選是否夜間加成(夜間加成20%)。 
  *  3. 按下JButton元件可以計算車資
  *  且在一JLabel元件顯示 里程數在1500公尺內是80元
  *  每多跑500公尺加5元,如果不足500公尺以500公尺價錢計算
  *  夜間加成20%。
  */
 
 JPanel panel = new JPanel();   //新增一個Panel容器
 JCheckBox night_box = new JCheckBox(); //新增「夜間加成」選項
 JButton count_btn = new JButton();  //新增「計算」的按鈕
 JLabel label = new JLabel();   //新增顯示結果文字標籤
 JTextField field = new JTextField(20); //新增一個文字框
 
 public a11967046(){
  //設定應用程式的標題
  super("計程車車資計算器");
  //取得視窗容器
  Container c = this.getContentPane();
  //設定文字框內訊息
  field.setText("請於此輸入里程數");
  //全選文字框,方便使用者更改
  field.selectAll();
  //設定按鈕文字
  count_btn.setText("計算車資");
  //設定文字標籤提示訊息
  label.setText("此處列出計算結果");
  //設定CheckBox文字
  night_box.setText("夜間加成");
  
  //將物件加入Panel中
  panel.add(field);
  panel.add(count_btn);
  panel.add(label);
  panel.add(night_box);
  
  //將Panel加入Container中
  c.add(panel);
  
  //建立按鈕的監聽事件,呼叫自己這個的類別,去實作ActionListener
  //和一個actionPerformed方法
  count_btn.addActionListener(this);
 }
 
 public static void main(String[] args) {
  a11967046 frame = new a11967046();
  //設定frame的關閉事件為DISPOSE_ON_CLOSE:
  //將本視窗的系統資源釋放掉,等到所有視窗都被Dispose時,
  //則關閉應用程式
  frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  //設定frame的Size
  frame.setSize(300,150);
  //設定frame為可見
  frame.setVisible(true);

 }

 @Override
 public void actionPerformed(ActionEvent event) {
  double sum = 0;  //乘客需要付款的總額
  int count = 0;  //當里程數不足500時,用來計算的變數
  //取得里程數
  int mile = Integer.parseInt(field.getText());
  
  //當「夜間加成」的按鈕被選取時,所有的總價需乘以20%
  if (night_box.isSelected()){
   //假設里程數低於1500
   if(mile <= 1500){
    sum = 80 * 1.2;
    label.setText("乘客需付" + sum + "元");
   }
   //假設里程數可以被整除
   else if(mile%500 != 0){
    //使用For迴圈計算里程數的價錢
    //先扣除1500後,再計算可以被500除幾次
    //類似整數除法
    for (int i = mile-1500 ; i>=0; i-=500){
     count++;
    }
    sum = (80 + count*5)*1.2;
    label.setText("乘客需付" + sum + "元");
    
   }
   //當里程數大於1500且又不能被500整除
   //會落入這個階段,這時直接將里程數扣掉1500
   //並且除以500得出的數字乘以5元即可
   else{
    sum = (80 + (mile-1500)/500*5)*1.2;
    label.setText("乘客需付" + sum + "元");
   }
   
  }
  //以下類同,僅差20%加成
  else{
   if(mile <= 1500){
    sum = 80;
    label.setText("乘客需付" + sum + "元");
   }
   else if(mile%500 != 0){
    for (int i = mile-1500 ; i>=0; i-=500){
     count++;
    }
    sum = 80 + count*5;
    label.setText("乘客需付" + sum + "元");
    
   }
   else{
    sum = (80 + (mile-1500)/500*5);
    label.setText("乘客需付" + sum + "元");
   }
  }
  
 }

}


沒有留言:

張貼留言

歡迎提供良性建議^_^