恬然自得.活在當下: [功課]Java Swing使用KeyListener更有即時性..第三次修正!

2011年6月7日 星期二

[功課]Java Swing使用KeyListener更有即時性..第三次修正!

(第三修:真慘-"-這個作業在理解上的誤差,導致我已經第三次修正了,請同學們趕緊改回來QQ)


這次老師的要求,感覺比較具有即時性,至少當你在打入數字和打勾時,就能馬上計算出價錢;前幾次功課也特別寫了一個「即時運算」的功能,沒想到這次功課就出了一個類似的題目!

另外我在查找資料的過程,也搜尋到一個不錯的網誌,分享給各位參考參考;寫這個教學網誌的Blog主也真是夠好心呀!看到他寫的程式碼也真的讓我多學到很多東西。

程式語言教學誌:
程式語言教學誌--Java 入門指南 - GUI 的基本概念:
程式語言教學誌-- Java 入門指南 - 排版管理員:
程式語言教學誌-- Java 入門指南 – GridBagLayout
之後還有很多很多系列的文章就請大家自行前往嘍~~

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


執行結果:



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

寫法僅供參考,畢竟Java才學不到一年吧 >”<
(大家記得註解和程式碼要自己重新打過唷,工讀生會檢查;請大家要多多修改唷,尤其在版面的樣子,這是最好改,也是最不容易被老師抓到的地方,請多下點功夫!)
程式碼:

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
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, KeyListener{

 /* 11967046  公版
  * 請建立光碟燒錄片的訂購程式,
  * 使用JCheckBox元件勾選購買哪一種光碟片,
  * 即可在JLabel元件顯示總片數和總價(不需使用JButton元件)
  * 訂購單位為50片,白金片每片3元、金片4元、水藍片5元,DVD片7元
  * 其後擁有JTextField輸入每種燒錄片的訂購數量(預設值為50)
  * 不足50片則以50片計。  
  */
 
 JLabel tip_lb = new JLabel();
 JLabel tip2_lb = new JLabel();
 JLabel sum_lb = new JLabel();
 JCheckBox platinumDisc_box = new JCheckBox();
 JCheckBox goldDisc_box = new JCheckBox();
 JCheckBox seafoamDisc_box = new JCheckBox();
 JCheckBox digitalVersatileDisc_box = new JCheckBox();
 JTextField platinumDisc_tf = new JTextField();
 JTextField goldDisc_tf = new JTextField();
 JTextField seafoamDisc_tf = new JTextField();
 JTextField digitalVersatileDisc_tf = new JTextField();
 
 public a11967046(){
  super("光碟燒錄片訂購程式");
  Container contain = this.getContentPane();
  
  //這是BoxLayout,將排版方式設定為垂直放置
  Box parent_panel = Box.createVerticalBox();
  JPanel top_panel = new JPanel();
  JPanel bottom_panel = new JPanel();
  
  bottom_panel.setLayout(new GridLayout(0,2));
  
  tip_lb.setText("請勾選光碟片種類,並在輸入框內輸入數量。" );
  tip2_lb.setText("若是您的訂購不足50片,將以50片價格計算");
  sum_lb.setText("總價為");
  sum_lb.setBorder(BorderFactory.createMatteBorder(
    2, 2, 2, 2, Color.blue));
  
  platinumDisc_box.setText("白金片/3元");
  goldDisc_box.setText("金片/4元");
  seafoamDisc_box.setText("水藍片/5元");
  digitalVersatileDisc_box.setText("DVD/7元");
  platinumDisc_tf.setText("50");
  goldDisc_tf.setText("50");
  seafoamDisc_tf.setText("50");
  digitalVersatileDisc_tf.setText("50");
  
  top_panel.add(tip_lb);
  top_panel.add(tip2_lb);
  top_panel.add(sum_lb);
  bottom_panel.add(platinumDisc_box);
  bottom_panel.add(goldDisc_box);
  bottom_panel.add(platinumDisc_tf);
  bottom_panel.add(goldDisc_tf);
  bottom_panel.add(seafoamDisc_box);
  bottom_panel.add(digitalVersatileDisc_box);
  bottom_panel.add(seafoamDisc_tf);
  bottom_panel.add(digitalVersatileDisc_tf);
  
  parent_panel.add(top_panel);
  parent_panel.add(bottom_panel);
  
  contain.add(parent_panel);
  
  //替checkbox和textfield增加事件
  //也是這次功課的核心重點
  platinumDisc_box.addActionListener(this);
  goldDisc_box.addActionListener(this);
  seafoamDisc_box.addActionListener(this);
  digitalVersatileDisc_box.addActionListener(this);
  platinumDisc_tf.addKeyListener(this);
  goldDisc_tf.addKeyListener(this);
  seafoamDisc_tf.addKeyListener(this);
  digitalVersatileDisc_tf.addKeyListener(this);
 }
 
 public static void main(String[] args) {
  a11967046 frame = new a11967046();
  frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  frame.setSize(300,300);
  frame.setResizable(false);
  frame.setVisible(true);

 }

 @Override
 public void actionPerformed(ActionEvent event) {
  countDiscPrice();
 }
 

 @Override
 public void keyPressed(KeyEvent arg0) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void keyReleased(KeyEvent arg0) {
  // TODO Auto-generated method stub
  countDiscPrice();
 }

 @Override
 public void keyTyped(KeyEvent arg0) {
  // TODO Auto-generated method stub
  
 }
 
 public void countDiscPrice(){
  //宣告計算總數的變數
  int sum = 0;
  
  //當四個checkbox有被選取到時,才會把價格加進sum變數中
  if(platinumDisc_box.isSelected() == true){
   int platinumDisc_quantity = 
    Integer.parseInt(platinumDisc_tf.getText());
   
   if(platinumDisc_quantity <= 50){
    sum += 50*3; 
   }
   else{
    sum += platinumDisc_quantity*3;
   }
   
  }
  if(goldDisc_box.isSelected() == true){
   int goldDisc_quantity = 
    Integer.parseInt(goldDisc_tf.getText());
   
   if(goldDisc_quantity <= 50){
    sum += 50*4; 
   }
   else{
    sum += goldDisc_quantity*4;
   }
  }
  if(seafoamDisc_box.isSelected() == true){
   int seafoamDisc_quantity = 
    Integer.parseInt(seafoamDisc_tf.getText());
   
   if(seafoamDisc_quantity <= 50){
    sum += 50*4; 
   }
   else{
    sum += seafoamDisc_quantity*4;
   }
  }
  if(digitalVersatileDisc_box.isSelected() == true){
   int digitalVersatileDisc_quantity = 
    Integer.parseInt(digitalVersatileDisc_tf.getText());

   if(digitalVersatileDisc_quantity <= 50){
    sum += 50*4; 
   }
   else{
    sum += digitalVersatileDisc_quantity*4;
   }
  }
  sum_lb.setText("總價為" + sum);
 }

}



1 則留言:

  1. 埃呀!我發現我少看一行,待會程式碼會重改唷-"-

    回覆刪除

歡迎提供良性建議^_^