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.
Trang 1I,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
Trang 2Java 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.
Trang 3
Hình 2:Demo Combobox
Khai báo ComboBox như sau:
Trang 5
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(); }
Trang 6Nú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);
//Group the radio buttons.
ButtonGroup group = new ButtonGroup();
Trang 7Mộ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[]
Trang 8Hì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++) {
Trang 9Để 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) {
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
Trang 10int column = e.getColumn();
TableModel model = (TableModel)e.getSource();
String columnName = model.getColumnName(column);
Object data = model.getValueAt(row, column);
// Do something with the data
Trang 11//Set up the dialog that the button brings up.
colorChooser = new JColorChooser();
dialog = JColorChooser.createDialog(button,
"Pick a Color",
true, //modal
colorChooser,
this, //OK button handler
null); //no CANCEL button handler }
public void actionPerformed(ActionEvent e) {
if (EDIT.equals(e.getActionCommand())) {
//The user has clicked the cell, so
//bring up the dialog
button.setBackground(currentColor);
colorChooser.setColor(currentColor);
dialog.setVisible(true);
fireEditingStopped(); //Make the renderer reappear
} else { //User pressed dialog's "OK" button
currentColor = colorChooser.getColor();
}
}
Trang 123.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:
Trang 13có thể chỉ định nút khác Một nút có thể hoặc có con hay không.Chúng ta cùng nhau xem qua đoạn demo về Tree sau:
private JTree tree;
hệ điều hành có thể khác nhau về đồ họa nhưng bản chất nó không có gì thay đổi.
Khởi tạo một cây thư mục như sau:
rootNode = new DefaultMutableTreeNode("Root Node");
treeModel = new DefaultTreeModel(rootNode);
Trang 14Nếu DefaultTreeModel không phù hợp với nhu cầu của bạn, bạn sẽ cần phải viết một mô hình dữ liệu 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ư là một nút cây Nó không đòi hỏi rằng các nút được biểu diễn bởi các đối tượng DefaultMutableTreeNode, 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ó.
Button b1=new Button("Center Aligned Button 1");
Button b2=new Button("Center Aligned Button 2");
Button b3=new Button("Center Aligned Button 3");
public Fltest(String title)
{
super(title);
setLayout(new FlowLayout(FlowLayout.CENTER));
Trang 15
Hình 7:FlowLayout
2.BorderLayout.
Trang 16Container được chia làm 5 vùng theo các hướng:đông,tây,nam,bắc,trung tâm.
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 và của cái gì.
Một số xử lý sự kiện đơn giản.
Trang 17Ex1:sự kiện của các nut bấm
public class MultiListener implements ActionListener {
Trang 18actionPerformed Mỗi khi người dùng nhấn nút,hành động này sẽ được bắt bởi ActionListener.Ví dụ:
import java.awt.*;
import java.awt.event.*;
public class AL extends Frame implements WindowListener,ActionListener {
TextField text = new TextField(20);
Button b;
private int numClicks = 0;
public static void main(String[] args) {
AL myWindow = new AL("My first window");
public void windowOpened(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
}
Trang 192.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 {
JList list = new JList(listVector);
list.setSelectedIndex(1); //It's easier to see the focus change
//if an item is selected
list.addFocusListener(this);
JScrollPane listScrollPane = new JScrollPane(list);
//Set up the area that reports focus-gained and focus-lost events
display = new JTextArea();
display.setEditable(false);
//The method setRequestFocusEnabled prevents a
//component from being clickable, but it can still
//get the focus through the keyboard - this ensures
public void focusGained(FocusEvent e) {
displayMessage("Focus gained", e);
}
Trang 20public void focusLost(FocusEvent e) {
displayMessage("Focus lost", e);
//where initialization occurs
Trang 21
private void addComponentsToPane() {
display = new JTextArea();
Trang 22displayMessage("WindowListener method called: windowClosing.");
//A pause so user can see the message before
//the window actually closes
ActionListener task = new ActionListener() {
boolean alreadyDisposed = false;
public void actionPerformed(ActionEvent e) {
Timer timer = new Timer(500, task); //fire every half second
timer.setInitialDelay(2000); //first delay 2 seconds
timer.setRepeats(false);
timer.start();
}
public void windowClosed(WindowEvent e) {
//This will only be seen on standard output
displayMessage("WindowListener method called: windowClosed.");
}
public void windowOpened(WindowEvent e) {
displayMessage("WindowListener method called: windowOpened.");
}
public void windowIconified(WindowEvent e) {
displayMessage("WindowListener method called: windowIconified.");
}
public void windowDeiconified(WindowEvent e) {
displayMessage("WindowListener method called: windowDeiconified."); }
public void windowActivated(WindowEvent e) {
displayMessage("WindowListener method called: windowActivated.");
}
public void windowDeactivated(WindowEvent e) {
displayMessage("WindowListener method called: windowDeactivated."); }
public void windowGainedFocus(WindowEvent e) {
displayMessage("WindowFocusListener method called: windowGainedFocus."); }
public void windowLostFocus(WindowEvent e) {
displayMessage("WindowFocusListener method called: windowLostFocus.");
Trang 23void displayStateMessage(String prefix, WindowEvent e) {
int state = e.getNewState();
int oldState = e.getOldState();
//MAXIMIZED_BOTH is a concatenation of two bits, so
//we need to test for an exact match
if ((state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) { strState += "MAXIMIZED_BOTH";
Trang 24public class MouseEventDemo implements MouseListener {
//where initialization occurs:
//Register for mouse events on blankArea and the panel
blankArea.addMouseListener(this);
addMouseListener(this);
public void mousePressed(MouseEvent e) {
saySomething("Mouse pressed; # of clicks: "
+ e.getClickCount(), e);
}
public void mouseReleased(MouseEvent e) {
saySomething("Mouse released; # of clicks: "
+ e.getClickCount(), e);
}
public void mouseEntered(MouseEvent e) {
saySomething("Mouse entered", e);
}
public void mouseExited(MouseEvent e) {
saySomething("Mouse exited", e);
}
public void mouseClicked(MouseEvent e) {
saySomething("Mouse clicked (# of clicks: "
Trang 256.KeyEvent – KeyListener
Sự kiện này cho thấy khi người dùng gõ vào bàn phím Cụ thể, sự kiện này được bắn bởi các thành phần với trọng tâm là bàn phím khi người dùng nhấn phím bàn phím.Sẽ phát sinh ra hàm Keylistener của máy tính để bắt sự kiện này.Ví dụ:
public class KeyEventDemo implements KeyListener {
//where initialization occurs:
typingArea = new JTextField(20);
typingArea.addKeyListener(this);
//Uncomment this if you wish to turn off focus
//traversal The focus subsystem consumes
//focus traversal keys, such as Tab and Shift Tab
//If you uncomment the following line of code, this
//disables focus traversal and the Tab events
//become available to the key event listener
//typingArea.setFocusTraversalKeysEnabled(false);
/** Handle the key typed event from the text field */
public void keyTyped(KeyEvent e) {
displayInfo(e, "KEY TYPED: ");
}
/** Handle the key-pressed event from the text field */
public void keyPressed(KeyEvent e) {
displayInfo(e, "KEY PRESSED: ");
}
/** Handle the key-released event from the text field */
public void keyReleased(KeyEvent e) {
displayInfo(e, "KEY RELEASED: ");
}
private void displayInfo(KeyEvent e, String keyStatus){
//You should only rely on the key char if the event
//is a key typed event
int keyCode = e.getKeyCode();
keyString = "key code = " + keyCode
+ " ("
+ KeyEvent.getKeyText(keyCode)