Mô tả gần như đầy đủ về lập trình swing trong netbean,cho các bạn muốn nghiên cứu về lập trình giao diện java,cung cấp cách nhìn khá đầy đủ về lập trình giao diện.Nếu bạn đã từng vào trang chủ của Java (http:oracle.comjava), bạn sẽ nhìn thấy Swing được mô tả như là một tập các thành phần đồ họa được tạo ra để những cảm quan (LookFeel) được thể hiện vào thời điểm runtime. Thật sự, thì Swing còn nhiều hơn như thế. Swing là bộ công cụ GUI thế hệ kế tiếp mà Sun Microsystems tạo ra cho phép môi trường phát triển enterprise trong Java.Bằng môi trường phát triển enterprise, chúng ta hiểu rằng, các lập trình viên có thể sử dụng Swing để tạo ra các ứng dụng Java có khả năng mở rộng với một dãy nhiều thành phần mạnh mẽ. Thêm vào đó, bạn có thể kế thừa hoặc chỉnh sửa những thành phần này để điều khiển việc hiển thị và các hành xử của chúng.
I,Tổng quan về Swing. Nếu bạn đã từng vào trang chủ của Java (http://oracle.com/java), bạn sẽ nhìn thấy Swing được mô tả như là một tập các thành phần đồ họa được tạo ra để những cảm quan (Look&Feel) được thể hiện vào thời điểm runtime. Thật sự, thì Swing còn nhiều hơn như thế. Swing là bộ công cụ GUI thế hệ kế tiếp mà Sun Microsystems tạo ra cho phép môi trường phát triển enterprise trong Java.Bằng môi trường phát triển enterprise, chúng ta hiểu rằng, các lập trình viên có thể sử dụng Swing để tạo ra các ứng dụng Java có khả năng mở rộng với một dãy nhiều thành phần mạnh mẽ. Thêm vào đó, bạn có thể kế thừa hoặc chỉnh sửa những thành phần này để điều khiển việc hiển thị và các hành xử của chúng. Swing không phải là một từ viết tắt. Đó là tên thay thế cho một tập hợp lựa chọn của nó cho các designer khi dự án được thực hiện vào 1996. Swing thật sự là một phần của gia đình rộng lớn các sản phẩm của Java được biết đến như Java Foundation Classes s(JFC) bao gồm nhiều đặc điểm của Internet Foundation Classes của Netscape cũng như bị ảnh hưởng thiết kế của Taligent và Lighthouse Design của IBM. Swing được phát triển thật sự kể từ thời điểm bản beta của JDK 1.1, khoảng mùa xuân 1997. Swing API bản beta đưa ra khoảng nửa cuối 1997 và được chính thức phát hành vào tháng 3 năm 1998. Khi được phát hành, các thư viện của Swing 1.0 chứa khoảng 250 lớp và 80 giao tiếp. Sự phát triển được tiếp tục khi theo thời gian, bản Swing 1.4 chứa 85 giao tiếp public và 451 lớp public.Mặc dù Swing là được phát triển đơn lẻ từ lõi của Java Development Kit, nó yêu cầu phải có tối thiểu JDK 1.1.5 để chạy. Swing được xây dựng dựa trên những mô hình event được giới thiệu trong serie JDK 1.1. Bạn không thể sử dụng Swing với JDK 1.0.2, thêm vào đó bạn phải có Java 1.1 cho phép trình duyệt hỗ trợ Swing Applet. Java 2 SDK 1.4 được phát hành bao gồm nhiều lớp Swing được cập nhật và hỗ trợ một vài đặc điểm mới. Swing được tích hợp đầy đủ trong cả trong bộ công cụ của các nhà phát triển và runtime environment của tất cả các bản phát hành 1 | P a g e Java 2 (SDK 1.2 và những phiên bản cao hơn) chứa cả Java Plug-in.Cho đến nay dù java đã rất lâu từ khi java ra đời nó vẫn là ngô ngữ phổ biến của giới lập trình. Hình 1:Giao diện swing đơn giản II,Các thành phần giao tiếp cơ bản của swing. 1,Các container . 1.1.Jframe. JFrame là một Top-level Container thường được sử dụng để tạo các giao diện ứng dụng người dùng.Nó thường được dùng để chứa các thành phần giao diện khác ( Button, Label, … ). 1.2.JPanel. JPanel là một container (thùng chứa) nó dùng để chứa các đối tượng tương tự như JFrame tuy nhiên nó không phải là 1 JFrame. 2,Các Components. 2 | P a g e 2.1.Jlaybel. 2.2.JButton. 2.3.JCheckBox . 2.4.JTextField. 2.5.JTextArea. 3,Các thành phần khác. 3.1.JCombobox. JCombobox giống như một drop down box – bạn có thể click vào mũi tên drop down và chọn một lựa chọn từ một danh sách. Nó sinh ra ItemEvent.Thanh cuộn dọc thường được dùng cho một danh sách dài. Hình 2:Demo Combobox Khai báo ComboBox như sau: 3 | P a g e Hàm khởi tạo Combobox • JComboBox() • JComboBox(ComboBoxModel) • JComboBox(Object[]) • JComboBox(Vector) 3.2.JSlider. Một thành phần JSlider được thiết kế để cho phép người dùng dễ dàng nhập một giá trị số giới hạn bởi một giá trị tối thiểu và tối đa Thanh trượt của slider có thể tùy biến nằm ngang hoặc nằm dọc. Và chúng ta sẽ thấy các giá trị được biểu diễn trên một thanh trượt như sau 4 | P a g e Hình 3:Demo Jslider Khai báo JSlider như sau: public void stateChanged(ChangeEvent e) { JSlider source = (JSlider)e.getSource(); if (!source.getValueIsAdjusting()) { int fps = (int)source.getValue(); if (fps == 0) { if (!frozen) stopAnimation(); } else { delay = 1000 / fps; timer.setDelay(delay); timer.setInitialDelay(delay * 10); if (frozen) startAnimation(); } } } Hàm khởi tạo (contructor) của Jslider: • JSlider() • JSlider(int min, int max) • JSlider(int orientation) • JSlider(BoundedRangeModel) 5 | P a g e 3.3JRadioButton. Nút radio là nhóm các nút, trong đó, theo quy ước, chỉ có một nút tại một thời điểm có thể được lựa chọn.Dưới đây là mã từ RadioButtonDemo.java tạo ra các nút radio trong ví dụ trước và phản ứng với nhấp chuột. JRadioButton birdButton = new JRadioButton(birdString); birdButton.setMnemonic(KeyEvent.VK_B); birdButton.setActionCommand(birdString); birdButton.setSelected(true); JRadioButton catButton = new JRadioButton(catString); catButton.setMnemonic(KeyEvent.VK_C); catButton.setActionCommand(catString); JRadioButton dogButton = new JRadioButton(dogString); dogButton.setMnemonic(KeyEvent.VK_D); dogButton.setActionCommand(dogString); JRadioButton rabbitButton = new JRadioButton(rabbitString); rabbitButton.setMnemonic(KeyEvent.VK_R); rabbitButton.setActionCommand(rabbitString); JRadioButton pigButton = new JRadioButton(pigString); pigButton.setMnemonic(KeyEvent.VK_P); pigButton.setActionCommand(pigString); //Group the radio buttons. ButtonGroup group = new ButtonGroup(); group.add(birdButton); group.add(catButton); group.add(dogButton); group.add(rabbitButton); group.add(pigButton); //Register a listener for the radio buttons. birdButton.addActionListener(this); catButton.addActionListener(this); dogButton.addActionListener(this); rabbitButton.addActionListener(this); pigButton.addActionListener(this); public void actionPerformed(ActionEvent e) { picture.setIcon(new ImageIcon("images/" + e.getActionCommand() + ".gif")); } 6 | P a g e 3.4.Jlist. Một JList hiện cho người dùng với một nhóm sản phẩm, hiển thị trong một hoặc nhiều cột, để lựa chọn. Danh sách có thể có nhiều mặt hàng, do đó chúng thường được đặt trong tấm di chuyển. Ngoài danh sách, các thành phần Swing sau đây giới thiệu nhiều mặt hàng có thể lựa chọn cho người sử dụng: hộp tổ hợp, trình đơn, bảng biểu, và nhóm các hộp kiểm tra hoặc nút radio. Để hiển thị dữ liệu phân cấp, sử dụng một Tree. Hình 4:Demo Jlist Demo khai báo Jlist list = new JList(data); //data has type Object[] list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); list.setLayoutOrientation(JList.HORIZONTAL_WRAP); list.setVisibleRowCount(-1); JScrollPane listScroller = new JScrollPane(list); listScroller.setPreferredSize(new Dimension(250, 80)); 3.5 JTable. Với lớp JTable bạn có thể hiển thị bảng dữ liệu, tùy chọn cho phép người dùng chỉnh sửa dữ liệu. JTable không chứa dữ liệu hoặc bộ nhớ cache; nó chỉ đơn giản là một cách biểu diễn dữ liệu của bạn. 7 | P a g e Hình 5:Demo Jtable Theo mặc định, tất cả các cột trong một bảng bắt đầu với chiều rộng bằng nhau, và các cột tự động điền vào toàn bộ chiều rộng của bảng. Khi bảng trở nên rộng hơn hoặc hẹp hơn (có thể xảy ra khi người dùng thay đổi kích thước cửa sổ chứa bảng), tất cả các độ rộng cột thay đổi thích hợp. Khi người dùng thay đổi kích thước một cột bằng cách kéo biên phải của mình, sau đó một trong hai cột khác phải thay đổi kích thước, hoặc kích thước của bảng phải thay đổi. Theo mặc định, kích thước của bảng vẫn giữ nguyên, và tất cả các cột bên phải của điểm kéo thay đổi kích thước để phù hợp không gian thêm vào hoặc gỡ bỏ từ cột bên trái của điểm kéo. Để tùy chỉnh độ rộng cột ban đầu, bạn có thể gọi setPreferredWidth trên mỗi cột của bảng của bạn. Điều này đặt ra cả chiều rộng ưa thích của các cột và chiều rộng tương đối gần đúng của họ. Ví dụ, thêm đoạn mã sau vào SimpleTableDemo làm cho cột thứ ba của nó lớn hơn các cột khác: TableColumn column = null; for (int i = 0; i < 5; i++) { column = table.getColumnModel().getColumn(i); if (i == 2) { column.setPreferredWidth(100); //third column is bigger } else { column.setPreferredWidth(50); } } 8 | P a g e Để tạo một bảng mẫu trong Swing ta làm như sau. new AbstractTableModel() { public String getColumnName(int col) { return columnNames[col].toString(); } public int getRowCount() { return rowData.length; } public int getColumnCount() { return columnNames.length; } public Object getValueAt(int row, int col) { return rowData[row][col]; } public boolean isCellEditable(int row, int col) { return true; } public void setValueAt(Object value, int row, int col) { rowData[row][col] = value; fireTableCellUpdated(row, col); } } Lớp sự kiện của Jtable là TablemoderListener chúng ta hãy theo dõi demo sau đây import javax.swing.event.*; import javax.swing.table.TableModel; public class SimpleTableDemo implements TableModelListener { public SimpleTableDemo() { table.getModel().addTableModelListener(this); } public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); 9 | P a g e int column = e.getColumn(); TableModel model = (TableModel)e.getSource(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column); // Do something with the data } } Chúng ta có thể tạo một bảng trong đó kết hợp giữa Jtable với combobox hay với các thành phần khác được trình bày ở phần trước.Hãy cùng nhau xem xét các ví dụ sau: Ex1: TableColumn sportColumn = table.getColumnModel().getColumn(2); JComboBox comboBox = new JComboBox(); comboBox.addItem("Snowboarding"); comboBox.addItem("Rowing"); comboBox.addItem("Chasing toddlers"); comboBox.addItem("Speed reading"); comboBox.addItem("Teaching high school"); comboBox.addItem("None"); sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); Ex2:public class ColorEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { Color currentColor; 10 | P a g e [...]... tùy chỉnh Mô hình dữ liệu của bạn phải thực hiện giao diện TreeModel TreeModel quy định cụ thể phương pháp để có được một nút cụ thể của cây, nhận được số lượng con cháu của một nút cụ thể, xác định một nút là một chiếc lá, thông báo cho các mô hình của một sự thay đổi trong cây, và thêm và loại bỏ các mô hình giả hoặc cũ trong cây Thật thú vị, giao diện TreeModel chấp nhận bất kỳ loại đối tượng như... hoặc thậm chí là các nút thực hiện giao diện TreeNode Ví dụ, nếu bạn có một cấu trúc dữ liệu phân cấp từ trước, bạn không cần phải lặp lại nó hay buộc nó vào khuôn TreeNode Bạn chỉ cần thực hiện mô hình cây của bạn để nó sử dụng các thông tin trong cấu trúc dữ liệu hiện có III,Layout Manager Layout là những phương thức sắp xếp các component trong các container.Để thiết lập layout cho container chúng ta... locationString += "unknown"; } //Display information about the KeyEvent } } Qua các Demo phần trước chúng ta đã biết gần như hết các sự kiện của java swing, vậy bây giờ chúng ta hãy đến với một ví dụ cụ thể và sinh động của xử lý sự kiện trong java .Swing Demo Giải phương trình bậc hai: Class1: public class PTB2Engine { private int a; 26 | P a g e private int b; private int c; public PTB2Engine(int a, int b, int... windowClosed(WindowEvent e) {} 2.ForcusEvent – FocusListener Đây là sự kiện khi chuột hay phím cần tập trung vào một điểm nào đó lúc này sẽ máy tính sẽ gọi đến phương thức FocusListener để tập trung cho một giao diện duy nhất.Ví dụ khi bạn cần đăng ký tài khoản con trỏ chuột luôn nháy ở ô đăng ký đầu tiên,đúng không?Sau đây là Demo của FocusListener: public class FocusEventDemo implements FocusListener {... 11 | P a g e 3.6 JTree Với lớp JTree, bạn có thể hiển thị dữ liệu phân cấp Một đối tượng JTree không thực sự chứa dữ liệu của bạn; nó chỉ đơn giản là biểu diễn của dữ liệu Giống như bất kỳ thành phần Swing , cây được dữ liệu bằng cách truy vấn mô hình dữ liệu của nó Đây là một hình ảnh của một cây: Hình 6:Mô hình Tree JTree hiển thị dữ liệu theo chiều dọc Mỗi hàng hiển thị bởi các cây chứa chính xác... làm 5 vùng theo các hướng:đông,tây,nam,bắc,trung tâm Hình 8:BorderLayout 3.GridbagLayout Các Component được thêm vào dựa theo tọa độ mà chúng ta truyền vào Hình 9:GridbagLayout IV,Xử lý sự kiện trong Swing Sự kiện là sự tương tác của người dùng và phần mềm phải có sự phản hồi lại,sự tương tác có thể là một cú click chuột,nhấn phím,chọn trong danh sách….Khi bắt sự kiện phải chỉ ra đấy là sự kiện nào