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