Báo cáo Nhập môn Java

14 631 0
Báo cáo Nhập môn  Java

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐÀO TẠO QUỐC TẾ BÁO CÁO VỀ XỬ LÝ BÀN PHÍM , CHUỘT VÀ ÂM THANH TRONG JAVA Họ tên sinh viên:HOÀNG VĂN KIÊN MSSV: 20158204 Lớp:LTU14 MỤC LỤC MỤC LỤC Phần SƠ LƯỢC CHUNG VỀ XỬ LÝ SỰ KIỆN Phần XỬ LÝ SỰ KIỆN BÀN PHÍM Phần XỬ LÝ SỰ KIỆN CHUỘT Phần XỬ LÝ ÂM THANH Phần 1.SƠ LƯỢC CHUNG VỀ XỬ LÝ SỰ KIỆN Mô hình xử lý kiện (Event- handling Model): Ở phần đề cập đến vấn đề thiết kế giao diện chương trình ứng dụng mà chưa đề cập đến vấn đề xử lý kiện Những kiện phát sinh người dùng tương tác với giao diện chương trình GUI (Graphical User Interface: Giao diện đồ họa người dùng) Những tương tác thường gặp như: di chuyển, nhấn chuột, nhấn nút nhấn, chọn MenuItem hệ thống thực đơn, nhập liệu ô văn bản, đóng cửa sổ ứng dụng, … Khi có tương tác xảy kiện gởi đến chương trình Thông tin kiện thường lưu trữ đối tượng dẫn xuất từ lớp AWTEvent( Abstract Windowing Toolkit Event) Những kiểu kiện gói java.awt.event dùng cho component AWT JFC Đối với thư viện JFC có thêm kiểu kiện gói java.swing.event (ở ta không đề cập đến) Ba thành phần mô hình: • Nguồn phát sinh kiện (Event source): nguồn gây kiện, thường thành phần GUI chương trình, thành phần giao diện mà người dùng tác động • Sự kiện (Event object): Tóm tắt thông tin xử kiện xảy ra, bao gồm tham chiếu đến nguồn gốc phát sinh kiện thông tin kiện gởi đến cho lắng nghe xử lý • Bộ lắng nghe(Event listener):Một lắng nghe đối tượng lớp thực hay nhiều interface gói java.awt.event Khi thông báo, lắng nghe nhận kiện xử lý Nguồn phát sinh kiện phải cung cấp phương thức để đăng ký hủy bỏ lắng nghe Nguồn phát sinh kiện phải gắn với lắng nghe, thông báo với lắng nghe có kiện phát sinh Như người lập trình cần làm hai việc: • Tạo đăng ký lắng nghe cho component GUI • Cài đặt phương thức quản lý xử lý kiện Một đối tượng Event-Listener lắng nghe kiện khác phát sinh từ components giao diện chương trình Với kiện khác phát sinh phương thức tương ứng Event-Listener gọi thực Mỗi interface EventListener gồm hay nhiều phương thức mà chúng cần cài đặt lớp thực (implements) interface Những phương thức interface trừu tượng lớp (bộ lắng nghe) thực interface phải cài đặt tất phương thức Nếu không lắng nghe trở thành lớp trừu tượng Phần 2.XỬ LÝ SỰ KIỆN BÀN PHÍM Để xử lý kiện bàn phím java hỗ trợ lắng nghe kiện interface KeyListener Một kiện bàn phím phát sinh người dùng nhấn nhả phím bàn phím Một lớp thực KeyListener phải cài đặt phương thức KeyPressed, KeyReleased KeyTyped Mỗi phương thức có tham số đối tượng kiểu KeyEvent KeyEvent lớp lớp InputEvent Các phương thức interface KeyListener: • Phương thức KeyPressed gọi phím nhấn • Phương thức KeyTyped gọi thực người dùng nhấn phím “phím hành động” (như phím mũi tên, phím Home, End, Page Up, Page Down, phím chức như: Num Lock, Print Screen, Scroll Lock, Caps Lock, Pause) • Phương thức keyReleased gọi thực nhả phím nhấn sau kiện KeyPressed KeyTyped Lớp KeyEvent có hàm:  int getKeyCode()  Đối với kiện keyPressed keyReleased, hàm sử dụng để nhận giá trị nguyên tương ứng với mã phím bàn phím Đối với kiện keyPressed, hàm sử dụng để nhận lại giá trị nguyên mã Unicode tương ứng với ký tự bàn phím Đăng ký đối tượng lắng nghe Để đăng ký đối tượng nghe ta sử dụng tên phương thức có cấu trúc sau: add + loại kiện + Listener(lớp nghe kiện) =>Ví dụ với Component: addKeyListener(KeyListener) Các phương thức Keylistener Interface:  keyTyped: public void keyTyped(KeyEvent event) {……… } : Được triệu hồi key gõ  keyPressed: public void keyPressed(KeyEvent event) {……… } : Được triệu hồi key nhấn  keyReleased: public void keyReleased(KeyEvent event) {……… } : Được triệu hồi key nhả Ví dụ: Minh họa việc xử lý kiện bàn phím thông qua phương thức interface KeyListener Lớp KeyDemo bên thực interface KeyListener, tất phương thức KeyListener phải cài đặt chương trình import java.awt.*; import java.awt.event.*; public class KeyDemo extends Frame implements KeyListener { private String line1 = "", line2 = ""; private String line3 = ""; private TextArea textArea; // set up GUI public KeyDemo() { super("KeyListenerDemo"); textArea = new TextArea(10, 15); textArea.setText("Please press any key on the keyboard !"); textArea.setEnabled(false); this.add(textArea); // allow frame to process Key events addKeyListener(this); setSize(350, 100); setVisible(true); } // handle press of any key public void keyPressed(KeyEvent event) { line1 = "Key pressed: " + event.getKeyText(event.getKeyCode()); setLines2and3(event); } // handle release of any key public void keyReleased(KeyEvent event) { line1 = "Key released: " + event.getKeyText(event.getKeyCode()); setLines2and3(event); } // handle press of an action key public void keyTyped(KeyEvent event) { line1 = "Key typed: " + event.getKeyChar(); setLines2and3(event); } // set second and third lines of output private void setLines2and3(KeyEvent event) { line2 = "This key is " + (event.isActionKey() ? "" : "not ") + "an action key"; String temp = event.getKeyModifiersText(event.getModifiers()); line3 = "Modifier keys pressed: " + (temp.equals("") ? "none" : temp); textArea.setText(line1 + "\n" + line2 + "\n" + line3 + "\n"); } // execute application public static void main(String args[]) { KeyDemo application = new KeyDemo(); } } Phần 3.XỬ LÝ SỰ KIỆN CHUỘT Lớp MouseEvent lớp lớp trừu tượng InputEvent sử dụng để xử lý tín hiệu chuột Lớp có hàm:  int getX()  int getY()  Point getPoint() Các hàm sử dụng để nhận lại tọa độ x,y vị trí liên quan đến kiện chuột gây  void translatePoint(int dx, int dy) Hàm translatePoint() sử dụng để chuyển tọa độ kiện chuột gây đến(dx , dy)  Int get ClickCount() Hàm get ClickCount() đếm số lần kích chuột Java cung cấp hai intefaces lắng nghe (bộ lắng nghe kiện chuột) MouseListener MouseMotionListener để quản lý xử lý kiện liên quan đến thiết bị chuột Những kiện chuột “bẫy” cho component GUI mà dẫn xuất từ java.awt.component Các phương thức interface MouseListener: • public void mousePressed(MouseEvent event): gọi nút chuột nhấn trỏ chuột component • public void mouseClicked(MouseEvent event): gọi nút chuột nhấn nhả component mà không di chuyển chuột • public void mouseReleased(MouseEvent event): gọi nút chuột nhả sa kéo rê • public void mouseEntered(MouseEvent event): gọi trỏ chuột vào đường biên component • public void mouseExited(MouseEvent event): gọi trỏ chuột khỏi đường biên component Các phương thức interface MouseMotionListener: • public void mouseDragged(MouseEvent even ): phương thức gọi người dùng nhấn nút chuột kéo component • public void mouseMoved(MouseEvent event): phương thức gọi di chuyển chuột component Mỗi phương thức xử lý kiện chuột có tham số MouseEvent chứa thông tin kiện chuột phát sinh chẳng hạn như: tọa độ x, y nơi kiện chuột xảy Những phương thức tương ứng interfaces tự động gọi chuột tương tác với component Để biết người dùng nhấn nút chuột nào, dùng phuơng thức, số lớp InputEvent (là lớp cha lớp MouseEvent) Ví dụ: Chương trình tên MouseTracker bên minh họa việc dùng phương thức interfaces MouseListener MouseMotionListener để “bẫy” xử lý kiện chuột tương ứng import java.awt.*; import java.awt.event.*; public class MouseTracker extends Frame implements MouseListener, MouseMotionListener { private Label statusBar; // set up GUI and register mouse event handlers: public MouseTracker() { super( "MouseDemo" ); statusBar = new Label(); this.add( statusBar, BorderLayout.SOUTH ); // application listens to its own mouse events: addMouseListener( this ); addMouseMotionListener( this ); setSize( 275, 100 ); setVisible( true ); } // MouseListener event handlers // handle event when mouse released immediately // after press public void mouseClicked( MouseEvent event ) { statusBar.setText( "Clicked at [" + event.getX()+", " + event.getY() + "]" ); } // handle event when mouse pressed: public void mousePressed( MouseEvent event ) { statusBar.setText( "Pressed at [" + event.getX() + ", " + event.getY() + "]" ); } // handle event when mouse released after dragging: public void mouseReleased( MouseEvent event ) { statusBar.setText( "Released at [" + event.getX() + ", " + event.getY() + "]" ); } // handle event when mouse enters area: public void mouseEntered( MouseEvent event ) { statusBar.setText( "Mouse in window" ); } // handle event when mouse exits area : public void mouseExited( MouseEvent event ) { statusBar.setText( "Mouse outside window" ); } // MouseMotionListener event handlers, // handle event when user drags mouse with button pressed: public void mouseDragged( MouseEvent event ) { statusBar.setText( "Dragged at [" + event.getX() + ", " + event.getY() + "]" ); } // handle event when user moves mouse: public void mouseMoved( MouseEvent event ) { statusBar.setText( "Moved at [" + event.getX() + } ", " + event.getY() + "]" ); // execute application: public static void main( String args[] ) { MouseTracker application = new MouseTracker(); } } // end class MouseTracker Phần XỬ LÝ ÂM THANH StdAudio thư viện mà bạn sử dụng để chơi thao tác tập tin âm Nó cho phép ta chơi, thao tác tổng hợp âm Có thể bạn dùng máy tính để xử lý âm nhạc, ta viết chương trình làm điều Các phương thức :  public static void close() : Đóng âm tiêu chuẩn  public static void play(double sample) : Mẫu âm tiêu chuẩn dao động từ -1 đến Nếu mẫu vượt quá, bị cắt Và throw IllegalArgumentException mẫu số( Double.NaN)  public static void play(double[] samples) : Giống mẫu dùng cho mảng  public static double[] read(String filename) : Đọc mẫu âm từ file có định dạng wav, au,… trả cho chúng mảng với giá trị thực từ -1 đến Trong đó,filename: tên âm  public static void play(String filename): Chạy file âm thanh(.wav,.au,.mid, ) luồng ẩn  public static void loop(String filename): Lặp file âm thanh(.wav,.au,.mid, ) luồng ẩn  public static void save (String filename,double[] samples): lưu file audio Package javax.sound.sampled : cung cấp cho interfaces classes cho việc bắt, xử lý phát lại liệu sampled audio Ví dụ interfaces như:Clip, DataLine,Line,Mixer,Port,SourceDataLine, class như: AudioFileFormat,AudioFormat,AudioInputStream,AudioSystem,… xử lý ngoại lệ như: LineUnavailableExcption,UnsupportedAudioFileException Ví dụ minh họa: import javax.sound.sampled.Clip; import java.io.File; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.IOException; import java.net.URL; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.UnsupportedAudioFileException; public final class StdAudio { //The sample rate - 44,100 Hz for CD quality audio public static final int SAMPLE_RATE = 44100; private static final int BYTES_PER_SAMPLE = 2; // 16-bit audio private static final int BITS_PER_SAMPLE = 16; // 16-bit audio private static final double MAX_16_BIT = Short.MAX_VALUE; // 32,767 private static final int SAMPLE_BUFFER_SIZE = 4096; private static SourceDataLine line; // to play the sound private static byte[] buffer; // our internal buffer private static int bufferSize = 0; // number of samples currently in internal buffer private StdAudio() { // can not instantiate } // static initializer static { init();// khởi tạo đối tượng } // open up an audio stream private static void init() { try { // 44,100 samples per second, 16-bit audio, mono, signed PCM, little Endian AudioFormat format = new AudioFormat((float) SAMPLE_RATE, BITS_PER_SAMPLE, 1, true, false); DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); line = (SourceDataLine) AudioSystem.getLine(info); line.open(format, SAMPLE_BUFFER_SIZE * BYTES_PER_SAMPLE); // the internal buffer is a fraction of the actual buffer size, this choice is arbitrary // it gets divided because we can't expect the buffered data to line up exactly with when // the sound card decides to push out its samples buffer = new byte[SAMPLE_BUFFER_SIZE * BYTES_PER_SAMPLE/3]; } catch (LineUnavailableException e) { System.out.println(e.getMessage()); } // no sound gets made before this call line.start(); } //Closes standard audio public static void close() { line.drain(); line.stop(); } public static void play(double sample) { // clip if outside [-1, +1] if (Double.isNaN(sample)) throw new IllegalArgumentException("sample is NaN"); if (sample < -1.0) sample = -1.0; if (sample > +1.0) sample = +1.0; // convert to bytes 10 short s = (short) (MAX_16_BIT * sample); buffer[bufferSize++] = (byte) s; buffer[bufferSize++] = (byte) (s >> 8); // little Endian // send to sound card if buffer is full if (bufferSize >= buffer.length) { line.write(buffer, 0, buffer.length); bufferSize = 0; } } public static void play(double[] samples) { if (samples == null) throw new NullPointerException("argument to play() is null"); for (int i = 0; i < samples.length; i++) { play(samples[i]); } } public static double[] read(String filename) { byte[] data = readByte(filename); int n = data.length; double[] d = new double[n/2]; for (int i = 0; i < n/2; i++) { d[i] = ((short) (((data[2*i+1] & 0xFF) > 8); } // now save the file try { ByteArrayInputStream bais = new ByteArrayInputStream(data); AudioInputStream ais = new AudioInputStream(bais, format, samples.length); if (filename.endsWith(".wav") || filename.endsWith(".WAV")) { AudioSystem.write(ais, AudioFileFormat.Type.WAVE, new File(filename)); } else if (filename.endsWith(".au") || filename.endsWith(".AU")) { AudioSystem.write(ais, AudioFileFormat.Type.AU, new File(filename)); } else { throw new RuntimeException("File format not supported: " + filename); } } catch (IOException e) { System.out.println(e); } } private static double[] note(double hz, double duration, double amplitude) { int n = (int) (StdAudio.SAMPLE_RATE * duration); double[] a = new double[n+1]; for (int i = 0; i

Ngày đăng: 09/10/2016, 11:39

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan