Bài 7: Cải tiến chương trình đồ họa liệt kê các số nguyên tố

Lê Hồng Phương phuonglh@gmail.com Khoa Toán-Cơ-Tin học Trường Đại học Khoa học Tự nhiên Hà Nội

Nội dung

● Nâng cấp chương trình liệt kê các số nguyên tố trong

bài giảng trước:

– Thêm các thực đơn

– Chọn các kiểu giao diện khác nhau của Swing

– Quản lí các ngoại lệ

2012-2013 Object-Oriented Programming: Exception 2

Các thành phần đồ họa

● Sử dụng thêm các thành phần đồ họa:

– JMenuBar

– JMenu

– JMenuItem

– JRadioButtonMenuItem

– JSeparator

– JOptionPane

● ​Sử dụng thêm các lớp tiện ích:

– ButtonGroup, SwingUtilities, UIManager

2012-2013 Object-Oriented Programming: Exception 3

Chương trình

● Thêm các thực đơn File, Look and Feel, Help.

● Thực đơn File có mục Exit

– Cho phép thoát chương trình

– Tương tự như nhấn chuột vào nút đóng cửa sổ.

● Thực đơn Look and Feel:

– Có các kiểu giao diện khác nhau nằm trong các nút chọn. Người dùng chọn kiểu nào thì giao diện được trình bày theo kiểu đó.

● Thực đơn Help chứa mục About.

2012-2013 Object-Oriented Programming: Exception 4

Các kiểu giao diện

● Java hỗ trợ nhiều kiểu giao diện đồ họa khác nhau,

gọi là các Look and Feel – LnF.

● Một số LnF thường gặp:

– Meta

– Nimbus

– Motif

– GTK (trên các hệ điều hành Unix, Linux)

2012-2013 Object-Oriented Programming: Exception 5

Các kiểu giao diện

● Để biết hệ thống Java trên máy có hỗ trợ sẵn những

kiểu LnF nào:

public class LookAndFeelLister {

public static void main(String[] args) {

try {

for (LookAndFeelInfo info :

UIManager.getInstalledLookAndFeels()) {

System.out.println(info.getClassName());

}

} catch (Exception e) { e.printStackTrace();

}

}

}

javax.swing.plaf.metal.MetalLookAndFeel com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel com.sun.java.swing.plaf.motif.MotifLookAndFeel com.sun.java.swing.plaf.gtk.GTKLookAndFeel

2012-2013 Object-Oriented Programming: Exception 6

Các kiểu giao diện

2012-2013 Object-Oriented Programming: Exception 7

Chương trình

Khi người dùng chọn mục Help > About

Thông báo lỗi khi người dùng nhập dữ liệu sai

JOptionPane.showMessageDialog(PrimeNumberFrame.this,

"Number format error!", "Error", JOptionPane.ERROR_MESSAGE);

JOptionPane.showMessageDialog(PrimeNumberFrame.this,

"A program for listing prime numbers", "About", JOptionPane.INFORMATION_MESSAGE);

2012-2013 Object-Oriented Programming: Exception 8

Chương trình: PrimeNumberFrame

// create a menu bar containing some menus JMenuBar menuBar = new JMenuBar();

Viết trong hàm tạo khi xây dựng cửa sổ chương trình.

// ...

// add the menu bar to the frame setJMenuBar(menuBar);

2012-2013 Object-Oriented Programming: Exception 9

Chương trình: PrimeNumberFrame

Đặt phím tắt Alt+F

// File menu JMenu menu = new JMenu("File"); menu.setMnemonic(KeyEvent.VK_F); JMenuItem exitMenuItem = new JMenuItem("Exit"); exitMenuItem.setMnemonic(KeyEvent.VK_X); exitMenuItem.addActionListener(new ExitActionListener()); menu.add(exitMenuItem); menuBar.add(menu);

class ExitActionListener implements ActionListener {

@Override public void actionPerformed(ActionEvent arg0) {

System.exit(0);

}

}

2012-2013 Object-Oriented Programming: Exception 10

Chương trình: PrimeNumberFrame

Các nút nằm trong cùng nhóm thì chỉ chọn được một tại một thời điểm.

// Look and Feel menu menu = new JMenu("Look and Feel"); menu.setMnemonic(KeyEvent.VK_L); ButtonGroup group = new ButtonGroup(); // Meta LnF JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem("Meta"); menuItem.setMnemonic(KeyEvent.VK_M); ActionListener lookAndFeelActionListener = new

ChooseLookAndFeelActionListener(

"javax.swing.plaf.metal.MetalLookAndFeel");

menuItem.addActionListener(lookAndFeelActionListener); group.add(menuItem); menu.add(menuItem);

2012-2013 Object-Oriented Programming: Exception 11

Chương trình: PrimeNumberFrame

// Nimbus LnF (Java 6, update 10) menuItem = new JRadioButtonMenuItem("Nimbus"); menuItem.setMnemonic(KeyEvent.VK_N); lookAndFeelActionListener = new

ChooseLookAndFeelActionListener(

"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

menuItem.addActionListener(lookAndFeelActionListener); group.add(menuItem); menu.add(menuItem);

2012-2013 Object-Oriented Programming: Exception 12

Chương trình: PrimeNumberFrame

class ChooseLookAndFeelActionListener implements ActionListener {

private String name; public ChooseLookAndFeelActionListener(String name) {

this.name = name;

Đặt giao diện mới

} @Override public void actionPerformed(ActionEvent e) {

try {

UIManager.setLookAndFeel(name); } catch (ClassNotFoundException exp) {

exp.printStackTrace();

} catch (InstantiationException exp) {

exp.printStackTrace();

} catch (IllegalAccessException exp) {

Cập nhật giao diện

exp.printStackTrace();

} catch (UnsupportedLookAndFeelException exp) {

exp.printStackTrace();

} SwingUtilities.updateComponentTreeUI(PrimeNumberFrame.this); PrimeNumberFrame.this.pack();

}

}

2012-2013 Object-Oriented Programming: Exception 13

Các thành phần đồ họa thực đơn

Object

Component

Container

JComponent

JMenuBar

JPopupMenu

JAbstractButton

JSeparator

JMenuItem

JMenu

JCheckboxMenuItem JRadioButtonMenuItem

2012-2013 Object-Oriented Programming: Exception 14

Chương trình

● Xem các tệp mã nguồn trong gói lecture6.primes2

– ​LookAndFeelLister.java – PrimeNumberApp.java

– PrimeNumberFrame.java

– PrimeNumbers.java

2012-2013 Object-Oriented Programming: Exception 15