Trong bối cảnh hiện nay khi mà các nghiên cứu đang chuyển sang hướng xây dựng các hệ thống thông minh, mạng nơuron nổi lên như một giải pháp đầy hứu hẹn. Nó thể hiện những ưu điểm nổi bật của mình so với các hệ thống khác ở khả
khác biệt giữa bộ óc con người với các máy thông minh nhân tạọ Nhưng cũng chính vì thế mà nó đòi hỏi một độ phức tạp rất cao trong thiết kế và cài đặt các hệ
thống ứng dụng để có thể đạt được một tính năng tốt. Khả năng này sẽ được cải thiện không ngừng trong tương lai cùng với sự phát triển của các mạch tích hợp phần cứng cỡ lớn và các bộ nhớ ngày càng lớn hơn cho các phần mềm máy vi tính. Chính vì điều này mà mạng neuron được coi là “kỹ thuật của thế kỷ 21”.
Các nhà bác học vẫn luôn tìm cách khám phá ra những quy tắc học và thuật toán học mới hiệu quả hơn. Một điều dễ nhận thấy là mặc dù mạng nơron mô phỏng trực tiếp bộ óc con người về mặt cấu trúc và trong mục tiêu của quá trình học (điều chỉnh các trọng số synnapse) nhưng các quy tắc học được đưa ra vẫn thuần tuý mang tính toán học và chưa thực sự là một sự bắt chước về mặt thần kinh sinh học của quá trình học xảy ra trong bộ óc...
Tóm lại, chúng ta có thể khẳng định một điều rằng mục tiêu tiến gần tới sự
hoàn hảo của bộ máy nhận thức của con người vẫn là một thách thức quá lớn ngay cảđối với một bộ môn lý thuyết mới như Lý thuyết mạng neuron mà bản chất tương tự thần kinh sinh học về cấu trúc cho chúng ta những “tia hy vọng” đáng lạc quan.
TÀI LIỆU THAM KHẢO
Tài liệu tham khảo tiếng Việt:
1. Lê Nam Quang (2010),Ứng dụng mạng neural trong nhận dạng kí tự, Luận văn tốt nghiệp, Trường Đại học Bách Khoa Hà Nộị
2. Lương Mạnh Bá, Nguyễn Thanh Thủy (1999), Nhập môn xử lý ảnh số, Nhà xuất bản khoa học và kỹ thuật, Hà Nộị
3. Ngô Xuân Bách (2006), Ứng dụng mô hình mạng nơron trong nhận dạng ký tự viết tay rời rạc hạn chế trực tuyến trên Tablet PC, Khóa luận tốt nghiệp
đại học, Đại học Công Nghệ, Đại học quốc gia Hà Nộị
Tài liệu tham khảo tiếng Anh
4. Artificial neural network - From Wikipedia, the free encyclopediạ http://en.wikipediạorg/wiki/Artificial_neural_network
5. Anand Venkataraman, The Backpropagation Algorithm
http://www.speech.srịcom/people/anand/771/html/node37.html 6. Christos Stergiou and Dimitrios Siganos, Neural Networks.
http://www.doc.ic.ac.uk/~nd/surprise_96/journal/vol4/cs11/report.html 7. Daniel T.Larose (2004), Discovering Knowledge in Data An Introduction to
Data Mining, Wiley Interscience, United States of American.
8. Dave Anderson and George McNeill (1992). Artificial Neural Networks Technology. Prepared for Rome Laboratory RL/C3C Griffiss AFB, NY 13441-5700, Kaman Sciences Corporation 258 Genesse Street Utica, New York 13502-4627.
9. Jeff Heaton (2005). Introduction to Neural Networks with Java, Heaton Research, Inc, United States of American.
10.Neural network - From Wikipedia, the free encyclopediạ http://en.wikipediạorg/wiki/Neural_network
11. Nikola K. Kasabov (1998). Foundations of Neural Networks, Fuzzy Systems, and Knowledge Engineering, Massachusetts Institute of Technology, The MIT Press, United States of Americạ
12.R.M. Hristev (1998), The ANN Book, GNU public licensẹ
13. Simon Haykin (1998). Neural Networks Comprehensive Foundation,
Second edition, Prentice Hall, Indian by Sai printoPack Pvt. Ltd.
14. Wang J., Jean J.S.N. (1993). Multi-Resolution Neural Network for Omnifont Character Recognition, IEEE International Conference on Neural Network.
PHỤ LỤC 1. Lớp SampleData
package net;
public class SampleData implements Comparable,Cloneable {
protected boolean grid[][]; // dữ liệu được lấy mẫu xuống là một lưới có kiểu booleans.
protected char letter; // ký tự /** tạo constructor
* @param letter là ký tự gì * @param width chiều rộng * @param height chiều cao */
public SampleDatăchar letter,int width,int height) {
grid = new boolean[width][height]; this.letter = letter;
}
/** thiết lập gía trị pixel cho giá trị mẫụ * @param x tọa độ x
* @param y tọa độ y
* @param v gía trị thiết lập */
public void setDatăint x,int y,boolean v) { grid[x][y]=v; } /** * trả về một pixel từ mẫu * @param x tọa độ x * @param y tọa độ y
* @return pixel được yêu cầu */
public boolean getDatăint x,int y) {
return grid[x][y]; }
{
for ( int x=0;x<grid.length;x++ ) for ( int y=0;y<grid[0].length;y++ ) grid[x][y]=false;
} /**
* @return trả về chiều cao của ảnh được lấy mẫu xuống. */
public int getHeight() {
return grid[0].length; }
/**
* @return trả về chiều rộng của ảnh được lấy mẫu xuống. */
public int getWidth() {
return grid.length; }
/**
* trả về mẫu đang thực hiện. * @return ký tự mẫu đang thực hiện. */
public char getLetter() {
return letter; }
/**
* thiết lập ký tự mà mẫu này đang thực hiện * @param letter ký tự mà mẫu này đang thực hiện. */
public void setLetter(char letter) {
this.letter = letter; }
/**
* so sánh mẫu này với mẫu khác, được sử dụng để phân loại * @param o đối tượng được so sánh với
public int compareTo(Object o) {
SampleData obj = (SampleData)o;
if ( this.getLetter()>obj.getLetter() ) return 1; else return -1; } /** * chuyển mẫu thành ký tự
* @return trả về ký tự tương ứng với mẫu */
public String toString() {
return ""+letter; }
/**
* tạo ra một bản sao của mẫu này * @return một bản sao của mẫu */
public Object clone() {
SampleData obj = new SampleDatăletter,getWidth(),getHeight()); for ( int y=0;y<getHeight();y++ )
for ( int x=0;x<getWidth();x++ ) obj.setDatăx,y,getDatăx,y)); return obj; } } 2. Lớp Sample package net; import javax.swing.*; import javạawt.*;
public class Sample extends JPanel { SampleData data; // dữ liệu hình ảnh. /**
* tạo constructor.
* @param height chiều dài của ảnh lấy mẫu xuống */
Sample(int width,int height) {
data = new SampleDatắ ',width,height); }
/**
* @return đối tượng dữ liệu ảnh. */ SampleData getDată) { return data; } /**
* thiết lập đối tượng dữ liệu ảnh * @param data đối tượng dữ liệu ảnh */
void setDatăSampleData data) {
this.data = data; }
/**
* @param g hiển thị hình ảnh được lấy mẫu xuống. */
public void paint(Graphics g) {
if ( data==null ) return;
int x,y;
int vcell = getHeight()/datạgetHeight(); int hcell = getWidth()/datạgetWidth(); g.setColor(Color.white); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(Color.black); for ( y=0;y<datạgetHeight();y++ ) g.drawLine(0,y*vcell,getWidth(),y*vcell); for ( x=0;x<datạgetWidth();x++ ) g.drawLine(x*hcell,0,x*hcell,getHeight());
for ( x=0;x<datạgetWidth();x++ ) { if ( datạgetDatăx,y) ) g.fillRect(x*hcell,y*vcell,hcell,vcell); } } g.setColor(Color.black); g.drawRect(0,0,getWidth()-1,getHeight()-1); } } 3. Lớp TrainingSet package net; import javạiọ*; import javạutil.*;
public class TrainingSet { protected int inputCount; protected int outputCount; protected double input[][]; protected double output[][]; protected int trainingSetCount; /**
* tạo constructor.
* @param inputCount số nơron đầu vào * @param outputCount số nơron đầu ra */
TrainingSet ( int inputCount , int outputCount ) { this.inputCount = inputCount; this.outputCount = outputCount; trainingSetCount = 0; } /**
* @return số nơron đầu vào */
public int getInputCount() {
return inputCount; }
* @return số nơron đầu ra */
public int getOutputCount() {
return outputCount; }
/**
* @param trainingSetCount có bao nhiêu mẫu trong tập huấn luyện */
public void setTrainingSetCount(int trainingSetCount) {
this.trainingSetCount = trainingSetCount;
input = new double[trainingSetCount][inputCount]; output = new double[trainingSetCount][outputCount]; }
/**
* trả về số mẫu của tập huấn luyện * @return Training set datạ
*/
public int getTrainingSetCount() {
return trainingSetCount; }
/**
* thiết lập đầu vào của tập huấn luyện. * @param set mẫu đầu vào
* @param index chỉ số * @param value giá trị
* @exception javạlang.RuntimeException */
void setInput(int set,int index,double value) throws RuntimeException
{
if ( (set<0) || (set>=trainingSetCount) )
throw(new RuntimeException(" 1 tập huấn luyện ngoài phạm vi:" + set ));
if ( (index<0) || (index>=inputCount) )
input[set][index] = value; }
/**
* thiết lập đầu ra của tập huấn luyện * @param set mẫu đầu vào
* @param index chỉ số * @param value giá trị
* @exception javạlang.RuntimeException */
void setOutput(int set,int index,double value) throws RuntimeException
{
if ( (set<0) || (set>=trainingSetCount) )
throw(new RuntimeException("3 tập huấn luyện ở ngoài phạm vi:" + set ));
if ( (index<0) || (set>=outputCount) )
throw(new RuntimeException("4 chỉ số đầu vào huấn luyện nằm ngoài phạm vi:" + index ));
output[set][index] = value; }
/**
* trả về một giá trị đầu vàọ * @param set mẫu đầu vàọ * @param index chỉ số
* @return một gía trị đầu vào
* @exception javạlang.RuntimeException */
double getInput(int set,int index) throws RuntimeException
{
if ( (set<0) || (set>=trainingSetCount) )
throw(new RuntimeException("5 tập huấn luyện nằm ngoài phạm vi:" + set ));
if ( (index<0) || (index>=inputCount) )
throw(new RuntimeException("6 chỉ số đầu vào huấn luyện nằm ngoài phạm vi:" + index ));
return input[set][index]; }
* trả về một giá trị đầu ra * @param set nối vào
* @param index chỉ số * @return giá trị đầu ra
* @exception javạlang.RuntimeException */
double getOutput(int set,int index) throws RuntimeException
{
if ( (set<0) || (set>=trainingSetCount) )
throw(new RuntimeException("7 tập huấn luyện nằm ngoài phạm vi: " + set ));
if ( (index<0) || (set>=outputCount) )
throw(new RuntimeException("8 chỉ số đầu vào huấn luyện nằm ngoài phạm v:" + index ));
return output[set][index]; }
/**
* trả về một tập đầu rạ * @param set đầu vào yêu cầu
* @return một mảng như là một tập đầu ra * @exception javạlang.RuntimeException */
double []getOutputSet(int set) throws RuntimeException
{
if ( (set<0) || (set>=trainingSetCount) )
throw(new RuntimeException("9 tập huấn luyện nằm ngoài phạm vi:" + set ));
return output[set]; }
/**
* trả về một tập đầu vào * @param set đầu vào yêu cầụ
* @return một tập đầu vào như là một mảng * @exception javạlang.RuntimeException */
{
if ( (set<0) || (set>=trainingSetCount) )
throw(new RuntimeException("10 tập huấn luyện nằm ngoài phạm vi:" + set )); return input[set]; } 4. Lớp Entry package net; import javax.swing.*; import javạawt.*; import javạawt.event.*; import javạawt.imagẹ*;
public class Entry extends JPanel {
protected Image entryImage; // ảnh mà người sử dụng vẽ vào protected Graphics entryGraphics;
protected int lastX = -1; // tọa độ x cuối cùng mà người sử dụng đang vẽ
protected int lastY = -1; // tọa độ y cuối cùng mà người sử dụng đang vẽ
protected Sample sample;
protected int downSampleLeft; // đường biên trái của hình chữ nhật cắt xén
protected int downSampleRight; // đường biên phải protected int downSampleTop; // đường biên trên protected int downSampleBottom; // đường biên dưới
protected double ratioX; // tỷ lệ lấy mẫu xuống theo trục x. protected double ratioY; // tỷ lệ lấy mẫu xuống theo trục y
protected int pixelMap[]; // sơ đồ pixel của ký tự được vẽ, được sử dụng để lấy mẫu xuống
Entry() // tạo constructor. {
enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK| AWTEvent.MOUSE_EVENT_MASK|
AWTEvent.COMPONENT_EVENT_MASK); }
protected void initImage() // cài đặt ảnh ban đầu mà người sử dụng vẽ lên.
{ entryImage = createImage(getWidth(),getHeight()); entryGraphics = entryImagẹgetGraphics(); entryGraphics.setColor(Color.white); entryGraphics.fillRect(0,0,getWidth(),getHeight()); } /** * vẽ ký tự và hình chữ nhật giới hạn * @param g đối tượng đồ họa
*/
public void paint(Graphics g) { if ( entryImage==null ) initImage(); g.drawImage(entryImage,0,0,this); g.setColor(Color.black); g.drawRect(0,0,getWidth(),getHeight()); g.setColor(Color.red);
g.drawRect(downSampleLeft, downSampleTop, downSampleRight - downSampleLeft, downSampleBottom -downSampleTop);
} /**
* @param e sự kiện */
protected void processMouseEvent(MouseEvent e) { if ( ẹgetID()!=MouseEvent.MOUSE_PRESSED ) return; lastX = ẹgetX(); lastY = ẹgetY(); } /** * @param e sự kiện. */
protected void processMouseMotionEvent(MouseEvent e) {
if ( ẹgetID()!=MouseEvent.MOUSE_DRAGGED ) return;
entryGraphics.drawLine(lastX,lastY,ẹgetX(),ẹgetY()); getGraphics().drawImage(entryImage,0,0,this);
lastX = ẹgetX(); lastY = ẹgetY(); }
public void setSample(Sample s) {
sample = s; }
public Sample getSample() {
return sample; }
/**
* @param y đường quét ngang.
* @return True nếu có bất kỳ pixel nào trên đường quét ngang */
//kiểm tra pixel theo chiều ngang có bằng -1 hay không? protected boolean hLineClear(int y)
{
int w = entryImagẹgetWidth(this); for ( int i=0;i<w;i++ ) {
if ( pixelMap[(y*w)+i] !=-1 ) return false;
}
return true; }
/** dùng tìm pixel trên đường quét dọc * @param x đường quét dọc.
* @return True nếu có bất kỳ pixel nào trên đường quét dọc */
protected boolean vLineClear(int x) {
int w = entryImagẹgetWidth(this); int h = entryImagẹgetHeight(this); for ( int i=0;i<h;i++ ) {
if ( pixelMap[(i*w)+x] !=-1 ) return false;
return true; }
/** phương thức được gọi tự động để cắt bỏ khoảng trắng xung quanh không liên quan đến ký tự
* @param w chiều rộng của ảnh * @param h chiều cao của ảnh */
protected void findBounds(int w,int h) // tìm giới hạn {
// tìm đường giới hạn trên for ( int y=0;y<h;y++ ) {
if ( !hLineClear(y) ) { //nếu tìm thấy điểm ảnh thì gán giới hạn trên
downSampleTop=y; break;
} }
// tìm đường giới hạn dưới for ( int y=h-1;y>=0;y-- ) { if ( !hLineClear(y) ) { downSampleBottom=y; break;
} }
// tìm đường giới hạn trái for ( int x=0;x<w;x++ ) { if ( !vLineClear(x) ) { downSampleLeft = x; break; } }
// tìm đường giới hạn phải for ( int x=w-1;x>=0;x-- ) { if ( !vLineClear(x) ) { downSampleRight = x; break; } }
protected boolean downSampleQuadrant(int x,int y)//lấy mẫu xuống {
int w = entryImagẹgetWidth(this);
int startX = (int)(downSampleLeft+(x*ratioX)); int startY = (int)(downSampleTop+(y*ratioY)); int endX = (int)(startX + ratioX);
int endY = (int)(startY + ratioY); for ( int yy=startY;yy<=endY;yy++ ) { for ( int xx=startX;xx<=endX;xx++ ) { int loc = xx+(yy*w);
if ( pixelMap[ loc ]!= -1 ) return true; } } return false; } // thực hiện ánh xạ thành điểm ảnh public void downSample()
{
int w = entryImagẹgetWidth(this); int h = entryImagẹgetHeight(this);
PixelGrabber grabber = new PixelGrabber(entryImage, 0, 0, w, h, true);
try {
grabber.grabPixels();
pixelMap = (int[])grabber.getPixels(); for(int i=0; i< pixelMap.length; i++){ }
findBounds(w,h); // đường viền bao ký tự
SampleData data = samplẹgetDată); // bây giờ thực hiện lấy mẫu xuống
ratioX = (double)(downSampleRight- downSampleLeft)/(double)datạgetWidth(); ratioY = (double)(downSampleBottom- downSampleTop)/(double)datạgetHeight();
for ( int y=0;y<datạgetHeight();y++ ) { for ( int x=0;x<datạgetWidth();x++ ) {
if ( downSampleQuadrant(x,y) )//nếu mà điểm ảnh có giá trị khác -1 datạsetDatăx,y,true);
else datạsetDatăx,y,false); } } samplẹrepaint(); repaint(); } catch ( InterruptedException e ) { } }
public void clear()//xóa hình ảnh { this.entryGraphics.setColor(Color.white); this.entryGraphics.fillRect(0,0,getWidth(),getHeight()); this.downSampleBottom = this.downSampleTop = this.downSampleLeft = this.downSampleRight = 0; repaint(); } } 5. Lớp MainEntry } package net; import javax.swing.*; import javạawt.*; import javạawt.event.*; import javạutil.*; import javạiọ*; import org.apachẹpoịpoifs.filesystem.*; import org.apachẹpoịss.usermodel.Cell; import org.apachẹpoịss.usermodel.Row; import org.apachẹpoịhssf.usermodel.HSSFCell; import org.apachẹpoịhssf.usermodel.HSSFRow; import org.apachẹpoịhssf.usermodel.HSSFSheet; import org.apachẹpoịhssf.usermodel.HSSFWorkbook; import org.apachẹpoịhssf.record.SelectionRecord;
static final int DOWNSAMPLE_WIDTH = 10; static final int DOWNSAMPLE_HEIGHT = 10;
Entry entry; //thành phần để người sử dụng vẽ vàọ
Sample sample; // thành phần lấy mẫu xuống để hiển thị hình ảnh được lấy mẫu xuống
DefaultListModel letterListModel = new DefaultListModel(); // các ký tự đã được định nghĩa
KohonenNetwork net; // mạng nơron
Thread trainThread = null; // thread nguồn được sử dụng cho huấn luyện
//tạo constructor. MainEntry() {
getContentPane().setLayout(null); entry = new Entry();
// ô vẽ ký tự nhận dạng
entrỵreshape(350, 35, 260, 200); getContentPane().ađ(entry);
// ma trận lưới
sample = new Sample(DOWNSAMPLE_WIDTH, DOWNSAMPLE_HEIGHT); samplẹreshape(470, 320, 100, 100);
entrỵsetSample(sample); getContentPane().ađ(sample);
setTitle("ĐỀ TÀI NHẬN DẠNG CHỮ VIẾT TAY TIẾNG VIỆT-Hoàng Thị Hồng Hà"); getContentPane().setLayout(null); setSize(650, 500); Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); setLocation((screen.width - 650) / 2, (screen.height - 500) / 2); setVisible(false); //tạo các nút nhấn, nhãn JLabel1.setText("Tập mẫu");
JLabel1.setFont(new Font("Times New Roman", Font.BOLD, 14)); getContentPane().ađ(JLabel1);
JLabel1.setBounds(100, 25, 80, 17); downSamplẹsetText("Ma trận");
downSamplẹsetFont(new Font("Times New Roman", Font.BOLD, 14));
downSamplẹsetActionCommand("Down Sample"); getContentPane().ađ(downSample);
downSamplẹsetBounds(500, 275, 100, 24); ađ.setText("Thêm ký tự");
ađ.setFont(new Font("Times New Roman", Font.BOLD, 14)); ađ.setActionCommand("Ađ");
getContentPane().ađ(ađ); ađ.setBounds(400, 250, 100, 24);
ađ.setBackground(getForeground()); clear.setText("Xóa chữ");
clear.setFont(new Font("Times New Roman", Font.BOLD, 14)); clear.setActionCommand("Clear");
getContentPane().ađ(clear); clear.setBounds(400, 275, 100, 24); recognizẹsetText("Nhận dạng");
recognizẹsetFont(new Font("Times New Roman", Font.BOLD, 14)); recognizẹsetActionCommand("Recognize"); getContentPane().ađ(recognize); recognizẹsetBounds(500, 250, 100, 24); JScrollPane1 .setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICA L_SCROLLBAR_ALWAYS); JScrollPane1.setOpaque(true); getContentPane().ađ(JScrollPane1); JScrollPane1.setBounds(20, 50, 230, 150); JScrollPane1.getViewport().ađ(letters); letters.setToolTipText("chương trình nhận dạng ký tự tiếng Việt rời rạc "); letters.setBounds(20, 50, 230, 150); del.setText("Xóa mẫu"); del.setActionCommand("Delete"); getContentPane().ađ(del); del.setBounds(50, 225, 144, 24); load.setText("Mẫu");
load.setFont(new Font("Times New Roman", Font.BOLD, 14)); load.setActionCommand("Load");
getContentPane().ađ(load); load.setBounds(50, 250, 72, 24);
savẹsetActionCommand("Save"); getContentPane().ađ(save);
savẹsetBounds(122, 250, 72, 24); train.setText("Học");
train.setFont(new Font("Times New Roman", Font.BOLD, 14)); train.setActionCommand("Begin Training");
getContentPane().ađ(train); train.setBounds(50, 275, 144, 24); // {{REGISTER_LISTENERS
SymAction lSymAction = new SymAction();
downSamplẹađActionListener(lSymAction); clear.ađActionListener(lSymAction); ađ.ađActionListener(lSymAction); del.ađActionListener(lSymAction);
SymListSelection lSymListSelection = new SymListSelection(); letters.ađListSelectionListener(lSymListSelection); load.ađActionListener(lSymAction); savẹađActionListener(lSymAction); train.ađActionListener(lSymAction); recognizẹađActionListener(lSymAction); letters.setModel(letterListModel); } /** * phương thức chính. * @param args */
public static void main(String args[]) {
try { javax.swing.UIManager.setLookAndFeel( "com.birosoft.liquid.LiquidLookAndFeel"); } catch (Exception e) { System.out.println(ẹtoString()); try { UIManager.setLookAndFeel( "javax.swing.plaf.metal.DefaultMetalTheme"); UIManager.setLookAndFeel( "javax.swing.plaf.metal.MetalLookAndFeel"); } catch (Exception err) {
System.out.println(err.toString()); } } (new MainEntry()).setVisible(true); } // {{DECLARE_CONTROLS
javax.swing.JLabel JLabel1 = new javax.swing.JLabel(); javax.swing.JLabel JLabel2 = new javax.swing.JLabel(); javax.swing.JButton downSample = new javax.swing.JButton(); javax.swing.JButton ađ = new javax.swing.JButton();
javax.swing.JButton clear = new javax.swing.JButton(); javax.swing.JButton recognize = new javax.swing.JButton(); javax.swing.JScrollPane JScrollPane1 = new
javax.swing.JScrollPane();
javax.swing.JList letters = new javax.swing.JList(); javax.swing.JButton del = new javax.swing.JButton(); javax.swing.JButton load = new javax.swing.JButton(); javax.swing.JButton save = new javax.swing.JButton(); javax.swing.JButton train = new javax.swing.JButton(); javax.swing.JLabel JLabel3 = new javax.swing.JLabel(); javax.swing.JLabel JLabel4 = new javax.swing.JLabel(); javax.swing.JLabel tries = new javax.swing.JLabel(); javax.swing.JLabel lastError = new javax.swing.JLabel(); javax.swing.JLabel bestError = new javax.swing.JLabel(); javax.swing.JLabel JLabel8 = new javax.swing.JLabel(); javax.swing.JLabel JLabel5 = new javax.swing.JLabel();
// }}
// {{DECLARE_MENUS
// }}
class SymAction implements javạawt.event.ActionListener {
public void actionPerformed(javạawt.event.ActionEvent event) {
Object object = event.getSource();