KESIMPULAN SARAN KESIMPULAN DAN SARAN

75

BAB V KESIMPULAN DAN SARAN

A. KESIMPULAN

Berdasarkan hasil penelitian dan pengembangan terhadap perangkat lunak Aplikasi Translator Messenger yang dibangun, maka dapat disimpulkan sebagai berikut: 1. Perangkat lunak Aplikasi Translator Messenger dibuat menggunakan metode penelitian dan pengembangan. Melalui tahapan analisis, desain, pengkodean dan pengujian. Perangkat lunak ini dikembangkan menggunakan bahasa pemrograman Java dan diintegrasikan dengan Google Translate API sebagai penerjemah bahasa. 2. Hasil pengujian black-box menyatakan bahwa unjuk kerja fungsionalitas semua fungsi pada Aplikasi Translator Messenger dapat dikatakan berfungsi sesuai dengan tujuan dari aplikasi tersebut. 3. Hasil pengujian kelayakan menyatakan sebagai berikut: a. Hasil pengujian correctness menyatakan bahwa perangkat lunak Aplikasi Translator Messenger telah memenuhi standar indikator correctness. b. Hasil pengujian reliability menyatakan bahwa setiap 5 jam pengoperasian perangkat lunak terjadi 1 kesalahan program. c. Hasil penilaian pengujian alpha yang dilakukan oleh ahli, menghasilkan dari segi functionality sebesar 90 dari rentang 84 - 100 dan dapat dikategorikan sangat layak serta dari segi usability 85 dari rentang 84 - 100 dan dapat dikategorikan sangat layak. d. Sedangkan hasil pengujian beta menghasilkan 89.69 dari segi functionality dan dikategorikan sangat layak serta 83.45 dari segi usability dan dikategorikan layak.

B. SARAN

Berdasarkan penelitian terhadap Aplikasi Translator Messenger yang telah dilakukan, maka dapat disimpulkan beberapa saran sebagai berikut: 1. Perlu adanya penambahan fitur-fitur yang lebih mendayagunakan aplikasi messenger, seperti video call, group discussion, mengirim dokumen atau file, mengirim gambar dsb. 2. Perlu adanya penambahan format aplikasi yang berbasis mobile dan web-based. 80 LAMPIRAN Lampiran 1. SK Skripsi Lampiran 2. Source Code Chatser import java.net.; import java.io.; import java.util.logging.; import java.sql.; import javax.swing.; import javax.swing.text.DefaultCaret; public class ChatServer extends javax.swing.JFrame implements Runnable { private ChatServerThread clients[] = new ChatServerThread[50]; private ServerSocket server = null; private Thread thread = null; private int clientCount = 0; public Connection conn; public Statement st; public ResultSet rs; public DefaultListModel list; String usercocok, sql,sqllis; AmbilClient ambil = new AmbilClient; public ChatServer { try { initComponents; textser.setEditablefalse; setTitle.:TM:.; setIconImagenew javax.swing.ImageIcon getClass. getResourcesun.jpg.getImage; server = new ServerSocket8000; textser.setTextServer started: + server; start; } catch IOException ex { Logger.getLoggerChatServer.class.getName.logLevel.SEVERE, null, ex; } } public void run { while thread = null { try { textser.append\n+Waiting for a client ...; addThreadserver.accept; DefaultCaret caret = DefaultCarettextser.getCaret; caret.setUpdatePolicyDefaultCaret.ALWAYS_UPDATE; } catchIOException ioe { System.out.printlnServer accept error: + ioe; stop; } } } public void start { if thread == null { thread = new Threadthis; thread.start; } } public void stop { if thread = null { thread.stop; thread = null; } } private int findClientint ID { for int i = 0; i clientCount; i++ if clients[i].getID == ID return i; return -1; } public synchronized void handleint ID, String input { String [] hikhik = input.split ; String usersend = hikhik[3]; if usersend.equalssaiaremove{ for int i = 0; i clientCount; i++ { clients[i].sendinput; } removeID; } else { for int i = 0; i clientCount; i++ { clients[i].sendinput; } } } Override public synchronized void removeint ID { int pos = findClientID; if pos = 0 { ChatServerThread toTerminate = clients[pos]; textser.append\n+Removing client thread + ID; if pos clientCount-1 for int i = pos+1; i clientCount; i++ clients[i-1] = clients[i]; clientCount--; try { toTerminate.close; } catchIOException ioe { System.out.printlnError closing thread: + ioe; } toTerminate.stop; } } private void addThreadSocket socket { if clientCount clients.length { textser.append\n + Client accepted: + socket; clients[clientCount] = new ChatServerThreadthis, socket; try { clients[clientCount].open; clients[clientCount].start; clientCount++; } catch IOException ioe { System.out.printlnError opening thread: + ioe; } } else System.out.printlnClient refused: maximum + clients.length + reached.; } SuppressWarningsunchecked editor-fold defaultstate=collapsed desc=Generated Code private void initComponents { jScrollPane1 = new javax.swing.JScrollPane; textser = new javax.swing.JTextArea; setDefaultCloseOperationjavax.swing.WindowConstants.EXIT_ON_CLOSE; textser.setColumns20; textser.setRows5; jScrollPane1.setViewportViewtextser; javax.swing.GroupLayout layout = new javax.swing.GroupLayoutgetContentPane; getContentPane.setLayoutlayout; layout.setHorizontalGroup layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADING .addGrouplayout.createSequentialGroup .addGap28, 28, 28 .addComponentjScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 345, javax.swing.GroupLayout.PREFERRED_SIZE .addContainerGap28, Short.MAX_VALUE ; layout.setVerticalGroup layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADING .addGroupjavax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup .addGap22, 22, 22 .addComponentjScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE .addGap29, 29, 29 ; pack; } editor-fold public static void mainString args[] { java.awt.EventQueue.invokeLaternew Runnable { public void run { new ChatServer.setVisibletrue; } }; } Variables declaration - do not modify private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea textser; End of variables declaration } ChatServerThread import java.net.; import java.io.; public class ChatServerThread extends Thread { private ChatServer server = null; private Socket socket = null; private int ID = -1; private DataInputStream streamIn = null; private DataOutputStream streamOut = null; AmbilClient ambil = new AmbilClient; public ChatServerThreadChatServer server1, Socket socket1 { server = server1; socket = socket1; ID = socket.getPort; } public void sendString msg { try { streamOut.writeUTFmsg; streamOut.flush; } catchIOException ioe { System.out.printlnID + ERROR sending: + ioe.getMessage; server.removeID; stop; } } public int getID { return ID; } Override public void run { System.out.printlnServer Thread + ID + running.; while true { try { server.handleID, streamIn.readUTF; } catchIOException ioe { System.out.printlnID + ERROR reading: + ioe.getMessage; server.removeID; stop; } } } public void open throws IOException { streamIn = new DataInputStreamnew BufferedInputStreamsocket.getInputStream; streamOut = new DataOutputStreamnew BufferedOutputStreamsocket.getOutputStream; } public void close throws IOException { if socket = null socket.close; if streamIn = null streamIn.close; if streamOut = null streamOut.close; } } Login import com.google.api.GoogleAPI; import com.google.api.GoogleAPIException; import com.google.api.translate.Language; import com.google.api.translate.Translate; import java.awt.event.; import java.util.logging.; import javax.swing.; import java.sql.; import java.util.; import java.io.; import java.net.; import javax.swing.Timer; public class Login extends javax.swing.JFrame implements Runnable{ public Connection conn; public Statement st; public ResultSet rs; private Socket socket = null; private Thread thread = null; private DataInputStream console = null; private DataOutputStream streamOut = null; private ThreadC client = null; DefaultListModel list = new DefaultListModel; DefaultListModel check = new DefaultListModel; String username, password, chatWith, pilihbahasa, useraccept, usersend, languagesend, languageaccept, hasiltranslate, passcocok; String [] hikhik; Timer timer; JPanel panel2; int x; Vector pms = new Vector; Login clientApplication; ArrayList ar = new ArrayList; public Login { initComponents; koneksilocalhost, chatting, root, ; tabbedPane.setEnabledAt1, false; combolanguage; GoogleAPI.setHttpReferrerhttp:ajax.googleapis.comajaxserviceslanguagetra nslate; GoogleAPI.setKeyAIzaSyCGyGqo7zI- rHLQbeWA_ixxBg3pmLEqv4M; menuSignout.setVisiblefalse; inputUsername.setFocusabletrue; Login.this. setTitle.:TM:.; setIconImagenew javax.swing.ImageIcon getClass. getResourcesun.jpg.getImage; } SuppressWarningsunchecked editor-fold defaultstate=collapsed desc=Generated Code private void initComponents { jPanel2 = new javax.swing.JPanel; panelbackk1 = new chat.panelbackk; jLabel1 = new javax.swing.JLabel; tabbedPane = new javax.swing.JTabbedPane; loginPanel = new javax.swing.JPanel; panelback1 = new chat.panelback; labelUsernName = new javax.swing.JLabel; inputUsername = new javax.swing.JTextField; labelPassword = new javax.swing.JLabel; inputPassword = new javax.swing.JPasswordField; bahasa = new javax.swing.JComboBox; connect = new javax.swing.JButton; SignUp = new javax.swing.JLabel; chatPanel = new javax.swing.JPanel; panelback2 = new chat.panelback; jScrollPane2 = new javax.swing.JScrollPane; listUser = new javax.swing.JList; jMenuBar1 = new javax.swing.JMenuBar; File = new javax.swing.JMenu; menuSignup = new javax.swing.JMenuItem; menuSignout = new javax.swing.JMenuItem; menuExit = new javax.swing.JMenuItem; setDefaultCloseOperationjavax.swing.WindowConstants.DISPOSE_ON_CLOS E; setResizablefalse; addWindowListenernew java.awt.event.WindowAdapter { public void windowClosingjava.awt.event.WindowEvent evt { formWindowClosingevt; } }; jPanel2.setBorderjavax.swing.BorderFactory.createEtchedBorder; panelbackk1.setBorderjavax.swing.BorderFactory.createEtchedBorder; jLabel1.setFontnew java.awt.FontTahoma, 1, 24; jLabel1.setForegroundnew java.awt.Color255, 255, 255; jLabel1.setTextTranslator Messenger; labelUsernName.setTextUsername; inputUsername.setCursornew java.awt.Cursorjava.awt.Cursor.TEXT_CURSOR; inputUsername.addKeyListenernew java.awt.event.KeyAdapter { public void keyReleasedjava.awt.event.KeyEvent evt { inputUsernameKeyReleasedevt; } }; labelPassword.setTextPassword; bahasa.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { bahasaActionPerformedevt; } }; connect.setTextLog In; connect.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { connectActionPerformedevt; } }; SignUp.setTextSign Up; SignUp.addMouseListenernew java.awt.event.MouseAdapter { public void mouseClickedjava.awt.event.MouseEvent evt { SignUpMouseClickedevt; } }; javax.swing.GroupLayout panelback1Layout = new javax.swing.GroupLayoutpanelback1; panelback1.setLayoutpanelback1Layout; panelback1Layout.setHorizontalGroup panelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LE ADING .addGrouppanelback1Layout.createSequentialGroup .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.LEADING .addGrouppanelback1Layout.createSequentialGroup .addGap52, 52, 52 .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.LEADING, false .addGrouppanelback1Layout.createSequentialGroup .addComponentlabelUsernName .addGap18, 18, 18 .addComponentinputUsername .addGrouppanelback1Layout.createSequentialGroup .addComponentlabelPassword .addGap18, 18, 18 .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.LEADING .addComponentinputPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentconnect .addGrouppanelback1Layout.createSequentialGroup .addGap90, 90, 90 .addComponentbahasa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addGrouppanelback1Layout.createSequentialGroup .addGap135, 135, 135 .addComponentSignUp .addContainerGap116, Short.MAX_VALUE ; panelback1Layout.setVerticalGroup panelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LE ADING .addGroupjavax.swing.GroupLayout.Alignment.TRAILING, panelback1Layout.createSequentialGroup .addContainerGap69, Short.MAX_VALUE .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.BASELINE .addComponentlabelUsernName, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentinputUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.UNRELATED .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.BASELINE .addComponentlabelPassword .addComponentinputPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addGap18, 18, 18 .addComponentbahasa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addGap18, 18, 18 .addComponentconnect, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.UNRELATED .addComponentSignUp .addGap32, 32, 32 ; javax.swing.GroupLayout loginPanelLayout = new javax.swing.GroupLayoutloginPanel; loginPanel.setLayoutloginPanelLayout; loginPanelLayout.setHorizontalGroup loginPanelLayout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEA DING .addGrouploginPanelLayout.createSequentialGroup .addComponentpanelback1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addContainerGapjavax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ; loginPanelLayout.setVerticalGroup loginPanelLayout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEA DING .addComponentpanelback1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ; tabbedPane.addTabLOGIN, loginPanel; listUser.addMouseListenernew java.awt.event.MouseAdapter { public void mouseClickedjava.awt.event.MouseEvent evt { listUserMouseClickedevt; } }; jScrollPane2.setViewportViewlistUser; javax.swing.GroupLayout panelback2Layout = new javax.swing.GroupLayoutpanelback2; panelback2.setLayoutpanelback2Layout; panelback2Layout.setHorizontalGroup panelback2Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LE ADING .addGrouppanelback2Layout.createSequentialGroup .addGap90, 90, 90 .addComponentjScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE .addContainerGap122, Short.MAX_VALUE ; panelback2Layout.setVerticalGroup panelback2Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LE ADING .addGroupjavax.swing.GroupLayout.Alignment.TRAILING, panelback2Layout.createSequentialGroup .addContainerGap26, Short.MAX_VALUE .addComponentjScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE .addGap21, 21, 21 ; javax.swing.GroupLayout chatPanelLayout = new javax.swing.GroupLayoutchatPanel; chatPanel.setLayoutchatPanelLayout; chatPanelLayout.setHorizontalGroup chatPanelLayout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEA DING .addComponentpanelback2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ; chatPanelLayout.setVerticalGroup chatPanelLayout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEA DING .addComponentpanelback2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ; tabbedPane.addTabCHAT, chatPanel; javax.swing.GroupLayout panelbackk1Layout = new javax.swing.GroupLayoutpanelbackk1; panelbackk1.setLayoutpanelbackk1Layout; panelbackk1Layout.setHorizontalGroup panelbackk1Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LE ADING .addGrouppanelbackk1Layout.createSequentialGroup .addGrouppanelbackk1Layout.createParallelGroupjavax.swing.GroupLayout.Ali gnment.LEADING .addGrouppanelbackk1Layout.createSequentialGroup .addGap67, 67, 67 .addComponentjLabel1 .addGrouppanelbackk1Layout.createSequentialGroup .addGap34, 34, 34 .addComponenttabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 341, javax.swing.GroupLayout.PREFERRED_SIZE .addContainerGap36, Short.MAX_VALUE ; panelbackk1Layout.setVerticalGroup panelbackk1Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LE ADING .addGrouppanelbackk1Layout.createSequentialGroup .addGap26, 26, 26 .addComponentjLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE .addGap18, 18, 18 .addComponenttabbedPane, javax.swing.GroupLayout.PREFERRED_SIZE, 284, javax.swing.GroupLayout.PREFERRED_SIZE .addContainerGap46, Short.MAX_VALUE ; javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayoutjPanel2; jPanel2.setLayoutjPanel2Layout; jPanel2Layout.setHorizontalGroup jPanel2Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADI NG .addComponentpanelbackk1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ; jPanel2Layout.setVerticalGroup jPanel2Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADI NG .addGroupjPanel2Layout.createSequentialGroup .addComponentpanelbackk1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addContainerGapjavax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ; File.setTextFile; File.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { FileActionPerformedevt; } }; menuSignup.setTextSign Up; menuSignup.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { menuSignupActionPerformedevt; } }; File.addmenuSignup; menuSignout.setTextSign Out; menuSignout.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { menuSignoutActionPerformedevt; } }; File.addmenuSignout; menuExit.setTextExit; menuExit.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { menuExitActionPerformedevt; } }; File.addmenuExit; jMenuBar1.addFile; setJMenuBarjMenuBar1; javax.swing.GroupLayout layout = new javax.swing.GroupLayoutgetContentPane; getContentPane.setLayoutlayout; layout.setHorizontalGroup layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADING .addComponentjPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE ; layout.setVerticalGroup layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADING .addGrouplayout.createSequentialGroup .addComponentjPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE .addContainerGapjavax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ; pack; } editor-fold public void run { while thread = null { try { streamOut.writeUTFconsole.readLine; streamOut.writeUTFhasil; streamOut.flush; } catchIOException ioe { System.out.printlnSending error: + ioe.getMessage; stop; } } } public void handleString msg { try { hikhik = msg.split ; usersend = hikhik[0]; useraccept = hikhik[2]; int pecah1 = msg.indexOf ; int pecah2 = msg.indexOf , pecah1 + 1; int pecah3 = msg.indexOf , pecah2 + 1; int pecah4 = msg.indexOf , pecah3 + 1; String ky = msg.substringpecah4; String sqllanguagesend = select from mes where userMes LIKE + usersend + ; st = conn.createStatement; rs = st.executeQuerysqllanguagesend; if rs.next { languagesend = rs.getString3; } String sqllanguageaccept = select from mes where userMes LIKE + useraccept + ; st = conn.createStatement; rs = st.executeQuerysqllanguageaccept; if rs.next { languageaccept = rs.getString3; } if ky.equals saiaremove { forint i = 0; i pms.size; i++{ Message tmp = Messagepms.geti; iftmp.chattingWith.equalsusersend{ tmp.textmes.append\n + usersend + sign out + \n; tmp.kirim.setEnabledfalse; } } } else { if ky.equals saiaecit { forint i = 0; i pms.size; i++{ Message tmp = Messagepms.geti; ifusername.equalsusersend { iftmp.chattingWith.equalsuseraccept{ tabbedPane.removeTabAti+2; pms.removeElementAti; } else if tmp.chattingWith.equalsusersend{ tmp.textmes.append\n + usersend + close chat + \n; } } } } else { INI FIX LHO JANGAN DIHAPUS try { hasiltranslate = Translate.DEFAULT.executeky, Language.valueOflanguagesend, Language.valueOflanguageaccept; } catch GoogleAPIException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } if username.equalsusersend { } else { if username.equalsuseraccept { if alreadyChattingusersend { createNewPMusersend; } else { } } } for int i = 0; i pms.size; i++ { Message tmp = Message pms.geti; if username.equalsuseraccept { if tmp.chattingWith.equalsusersend { tmp.textmes.appendusersend + : + hasiltranslate + \n; }} else if username.equalsusersend { if tmp.chattingWith.equalsuseraccept { tmp.textmes.appendusersend + : + ky + \n; } } } }} } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } } public void start throws IOException { console = new DataInputStreamSystem.in; console = new DataInputStreaminputText.getText; console = new DataInputStreamsocket.getInputStream; streamOut = new DataOutputStreamsocket.getOutputStream; if thread == null { client = new ThreadCthis, socket; thread = new Threadthis; thread.start; } } public void stop { if thread = null { thread.stop; thread = null; client.close; client.stop; }} public void connect{ tabbedPane.setEnabledAt0, false; tabbedPane.setEnabledAt1, true; tabbedPane.setSelectedIndex1; connect.setEnabledfalse; inputUsername.setText; inputPassword.setText; setTitleWelcome + username + - + pilihbahasa; menuSignout.setVisibletrue; menuSignup.setVisiblefalse; menuExit.setVisiblefalse; } public void combolanguage{ bahasa.addItemLanguage; bahasa.addItemAFRIKAANS; bahasa.addItemALBANIAN; bahasa.addItemAMHARIC; bahasa.addItemARABIC; bahasa.addItemARMENIAN; bahasa.addItemAZERBAIJANI; bahasa.addItemBASQUE; bahasa.addItemBELARUSIAN; bahasa.addItemBENGALI; bahasa.addItemBIHARI; bahasa.addItemBULGARIAN; bahasa.addItemBURMESE; bahasa.addItemCATALAN; bahasa.addItemCHEROKEE; bahasa.addItemCHINESE; bahasa.addItemCHINESE_SIMPLIFIED; bahasa.addItemCHINESE_TRADITIONAL; bahasa.addItemCROATIAN; bahasa.addItemCZECH; bahasa.addItemDANISH; bahasa.addItemDHIVEHI; bahasa.addItemDUTCH; bahasa.addItemENGLISH; bahasa.addItemESPERANTO; bahasa.addItemESTONIAN; bahasa.addItemFILIPINO; bahasa.addItemFINNISH; bahasa.addItemFRENCH; bahasa.addItemGALICIAN; bahasa.addItemGEORGIAN; bahasa.addItemGERMAN; bahasa.addItemGREEK; bahasa.addItemGUARANI; bahasa.addItemGUJARATI; bahasa.addItemHEBREW; bahasa.addItemHINDI; bahasa.addItemHUNGARIAN; bahasa.addItemICELANDIC; bahasa.addItemINDONESIAN; bahasa.addItemINUKTITUT; bahasa.addItemIRISH; bahasa.addItemITALIAN; bahasa.addItemJAPANESE; bahasa.addItemKANNADA; bahasa.addItemKAZAKH; bahasa.addItemKHMER; bahasa.addItemKOREAN; bahasa.addItemKURDISH; bahasa.addItemKYRGYZ; bahasa.addItemLAOTHIAN; bahasa.addItemLATVIAN; bahasa.addItemLITHUANIAN; bahasa.addItemMACEDONIAN; bahasa.addItemMALAY; bahasa.addItemMALAYALAM; bahasa.addItemMALTESE; bahasa.addItemMARATHI; bahasa.addItemMONGOLIAN; bahasa.addItemNEPALI; bahasa.addItemNORWEGIAN; bahasa.addItemORIYA; bahasa.addItemPASHTO; bahasa.addItemPERSIAN; bahasa.addItemPOLISH; bahasa.addItemPORTUGUESE; bahasa.addItemPUNJABI; bahasa.addItemROMANIAN; bahasa.addItemRUSSIAN; bahasa.addItemSANSKRIT; bahasa.addItemSERBIAN; bahasa.addItemSINDHI; bahasa.addItemSINHALESE; bahasa.addItemSLOVAK; bahasa.addItemSLOVENIAN; bahasa.addItemSPANISH; bahasa.addItemSWAHILI; bahasa.addItemSWEDISH; bahasa.addItemTAGALOG; bahasa.addItemTAJIK; bahasa.addItemTAMIL; bahasa.addItemTELUGU; bahasa.addItemTHAI; bahasa.addItemTIBETAN; bahasa.addItemTURKISH; bahasa.addItemUIGHUR; bahasa.addItemUKRANIAN; bahasa.addItemURDU; bahasa.addItemUZBEK; bahasa.addItemVIETNAMESE; bahasa.addItemWELSH; bahasa.addItemYIDDISH; } private void menuSignoutActionPerformedjava.awt.event.ActionEvent evt { String metyyu = username + to + chatWith + : + saiaremove; try { streamOut.writeUTFmetyyu; } catch IOException ex { Logger.getLoggerMessage.class.getName.logLevel.SEVERE, null, ex; } String query = delete from mes where userMes LIKE + username + ; try { st.executeUpdatequery; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } stop; timer.stop; try { conn.close; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } try { st.close; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } try { rs.close; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } this.dispose; } private void FileActionPerformedjava.awt.event.ActionEvent evt { this.dispose; } private void menuSignupActionPerformedjava.awt.event.ActionEvent evt { new Sign.setVisibletrue; } private void menuExitActionPerformedjava.awt.event.ActionEvent evt { this.dispose; } private void listUserMouseClickedjava.awt.event.MouseEvent evt { if evt.getClickCount == 1 || evt.getClickCount == 2 || evt.getClickCount == 3 { chatWith = StringlistUser.getSelectedValue; if chatWith.equalsusername{ JOptionPane.showMessageDialogthis, Its you; } else { chatWith = StringlistUser.getSelectedValue; privateMessageManagerchatWith; } } } private void SignUpMouseClickedjava.awt.event.MouseEvent evt { new Sign.setVisibletrue; } private void connectActionPerformedjava.awt.event.ActionEvent evt { try { if inputUsername.getText.equals || inputPassword.getText.equals ||bahasa.getSelectedItem.equalsLanguage { if inputUsername.getText.equals{ JOptionPane.showMessageDialogthis, You must fill Username; } else if inputPassword.getText.equals{ JOptionPane.showMessageDialogthis, You must fill Password; } else if bahasa.getSelectedItem.equalsLanguage{ JOptionPane.showMessageDialogthis, You must choose Language; } } else { username = new StringinputUsername.getText; password = new StringinputPassword.getText; String sql = select from identitas where username LIKE + username + ; st = conn.createStatement; rs = st.executeQuerysql; if rs.next { passcocok = rs.getString4; if password.equalspasscocok { connect; socket = new Socketlocalhost, 8000; start; x = socket.getLocalPort; try { String sqlid = insert into mesuserMes,idsocket,userLanguage values + username + , + x + , + pilihbahasa + ; st = conn.createStatement; st.executesqlid; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } ActionListener actionListener = new ActionListener { public void actionPerformedActionEvent actionEvent { try { list.clear; listUser.setModellist; String sqluseronline = select from mes order by userMes; st = conn.createStatement; rs = st.executeQuerysqluseronline; while rs.next { list.addElementrs.getObject1; } } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } } }; timer = new Timer1000, actionListener; timer.start; listUser.setModellist; } else { JOptionPane.showMessageDialogthis, Username or Password invalid; } } else if password.equalspassword{ JOptionPane.showMessageDialogthis, Username or Password invalid; } } } catch UnknownHostException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } catch IOException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } } private void bahasaActionPerformedjava.awt.event.ActionEvent evt { ifbahasa.getSelectedItem.equalsAFRIKAANS{ pilihbahasa = AFRIKAANS; } else ifbahasa.getSelectedItem.equalsALBANIAN{ pilihbahasa = ALBANIAN; } else ifbahasa.getSelectedItem.equalsAMHARIC{ pilihbahasa = AMHARIC; } else ifbahasa.getSelectedItem.equalsARABIC{ pilihbahasa = ARABIC; } else ifbahasa.getSelectedItem.equalsARMENIAN{ pilihbahasa = ARMENIAN; } else ifbahasa.getSelectedItem.equalsAZERBAIJANI{ pilihbahasa = AZERBAIJANI; } else ifbahasa.getSelectedItem.equalsBASQUE{ pilihbahasa = BASQUE; } else ifbahasa.getSelectedItem.equalsBELARUSIAN{ pilihbahasa = BELARUSIAN; } else ifbahasa.getSelectedItem.equalsBENGALI{ pilihbahasa = BENGALI; } else ifbahasa.getSelectedItem.equalsBIHARI{ pilihbahasa = BIHARI; } else ifbahasa.getSelectedItem.equalsBULGARIAN{ pilihbahasa = BULGARIAN; } else ifbahasa.getSelectedItem.equalsBURMESE{ pilihbahasa = BURMESE; } else ifbahasa.getSelectedItem.equalsCATALAN{ pilihbahasa = CATALAN; } else ifbahasa.getSelectedItem.equalsCHEROKEE{ pilihbahasa = CHEROKEE; } else ifbahasa.getSelectedItem.equalsCHINESE{ pilihbahasa = CHINESE; } else ifbahasa.getSelectedItem.equalsCHINESE_SIMPLIFIED{ pilihbahasa = CHINESE_SIMPLIFIED; } else ifbahasa.getSelectedItem.equalsCHINESE_TRADITIONAL{ pilihbahasa = CHINESE_TRADITIONAL; } else ifbahasa.getSelectedItem.equalsCROATIAN{ pilihbahasa = CROATIAN; } else ifbahasa.getSelectedItem.equalsCZECH{ pilihbahasa = CZECH; } else ifbahasa.getSelectedItem.equalsDANISH{ pilihbahasa = DANISH; } else ifbahasa.getSelectedItem.equalsDHIVEHI{ pilihbahasa = DHIVEHI; } else ifbahasa.getSelectedItem.equalsDUTCH{ pilihbahasa = DUTCH; } else ifbahasa.getSelectedItem.equalsENGLISH{ pilihbahasa = ENGLISH; } else ifbahasa.getSelectedItem.equalsESPERANTO{ + , - pilihbahasa = ESPERANTO; } else ifbahasa.getSelectedItem.equalsESTONIAN{ pilihbahasa = ESTONIAN; } else ifbahasa.getSelectedItem.equalsFILIPINO{ pilihbahasa = FILIPINO; } else ifbahasa.getSelectedItem.equalsFINNISH{ pilihbahasa = FINNISH; } else ifbahasa.getSelectedItem.equalsFRENCH{ pilihbahasa = FRENCH; } else ifbahasa.getSelectedItem.equalsGALICIAN{ pilihbahasa = GALICIAN; } else ifbahasa.getSelectedItem.equalsGEORGIAN{ pilihbahasa = GEORGIAN; } else ifbahasa.getSelectedItem.equalsGERMAN{ pilihbahasa = GERMAN; } else ifbahasa.getSelectedItem.equalsGREEK{ pilihbahasa = GREEK; } else ifbahasa.getSelectedItem.equalsGUARANI{ pilihbahasa = GUARANI; } else ifbahasa.getSelectedItem.equalsGUJARATI{ pilihbahasa = GUJARATI; } else ifbahasa.getSelectedItem.equalsHEBREW{ pilihbahasa = HEBREW; } else ifbahasa.getSelectedItem.equalsHINDI{ pilihbahasa = HINDI; } else ifbahasa.getSelectedItem.equalsHUNGARIAN{ pilihbahasa = HUNGARIAN; } else ifbahasa.getSelectedItem.equalsICELANDIC{ pilihbahasa = ICELANDIC; } else ifbahasa.getSelectedItem.equalsINDONESIAN{ pilihbahasa = INDONESIAN; } else ifbahasa.getSelectedItem.equalsINUKTITUT{ pilihbahasa = INUKTITUT; } else ifbahasa.getSelectedItem.equalsIRISH{ pilihbahasa = IRISH; } else ifbahasa.getSelectedItem.equalsITALIAN{ pilihbahasa = ITALIAN; } else ifbahasa.getSelectedItem.equalsJAPANESE{ pilihbahasa = JAPANESE; } else ifbahasa.getSelectedItem.equalsKANNADA{ pilihbahasa = KANNADA; } else ifbahasa.getSelectedItem.equalsKAZAKH{ pilihbahasa = KAZAKH; } else ifbahasa.getSelectedItem.equalsKHMER{ pilihbahasa = KHMER; } else ifbahasa.getSelectedItem.equalsKOREAN{ . pilihbahasa = KOREAN; } else ifbahasa.getSelectedItem.equalsKURDISH{ pilihbahasa = KURDISH; } else ifbahasa.getSelectedItem.equalsKYRGYZ{ pilihbahasa = KYRGYZ; } else ifbahasa.getSelectedItem.equalsLAOTHIAN{ pilihbahasa = LAOTHIAN; } else ifbahasa.getSelectedItem.equalsLATVIAN{ pilihbahasa = LATVIAN; } else ifbahasa.getSelectedItem.equalsLITHUANIAN{ pilihbahasa = LITHUANIAN; } else ifbahasa.getSelectedItem.equalsMACEDONIAN{ pilihbahasa = MACEDONIAN; } else ifbahasa.getSelectedItem.equalsMALAY{ pilihbahasa = MALAY; } else ifbahasa.getSelectedItem.equalsMALAYALAM{ pilihbahasa = MALAYALAM; } else ifbahasa.getSelectedItem.equalsMALTESE{ pilihbahasa = MALTESE; } else ifbahasa.getSelectedItem.equalsMARATHI{ pilihbahasa = MARATHI; } else ifbahasa.getSelectedItem.equalsMONGOLIAN{ pilihbahasa = MONGOLIAN; } else ifbahasa.getSelectedItem.equalsNEPALI{ pilihbahasa = NEPALI; } else ifbahasa.getSelectedItem.equalsNORWEGIAN{ pilihbahasa = NORWEGIAN; } else ifbahasa.getSelectedItem.equalsORIYA{ pilihbahasa = ORIYA; } else ifbahasa.getSelectedItem.equalsPASHTO{ pilihbahasa = PASHTO; } else ifbahasa.getSelectedItem.equalsPERSIAN{ pilihbahasa = PERSIAN; } else ifbahasa.getSelectedItem.equalsPOLISH{ pilihbahasa = POLISH; } else ifbahasa.getSelectedItem.equalsPORTUGUESE{ pilihbahasa = PORTUGUESE; } else ifbahasa.getSelectedItem.equalsPUNJABI{ pilihbahasa = PUNJABI; } else ifbahasa.getSelectedItem.equalsROMANIAN{ pilihbahasa = ROMANIAN; } else ifbahasa.getSelectedItem.equalsRUSSIAN{ pilihbahasa = RUSSIAN; } else ifbahasa.getSelectedItem.equalsSANSKRIT{ pilihbahasa = SANSKRIT; } else ifbahasa.getSelectedItem.equalsSERBIAN{ 0 1 2 pilihbahasa = SERBIAN; } else ifbahasa.getSelectedItem.equalsSINDHI{ pilihbahasa = SINDHI; } else ifbahasa.getSelectedItem.equalsSINHALESE{ pilihbahasa = SINHALESE; } else ifbahasa.getSelectedItem.equalsSLOVAK{ pilihbahasa = SLOVAK; } else ifbahasa.getSelectedItem.equalsSLOVENIAN{ pilihbahasa = SLOVENIAN; } else ifbahasa.getSelectedItem.equalsSPANISH{ pilihbahasa = SPANISH; } else ifbahasa.getSelectedItem.equalsSWAHILI{ pilihbahasa = SWAHILI; } else ifbahasa.getSelectedItem.equalsSWEDISH{ pilihbahasa = SWEDISH; } else ifbahasa.getSelectedItem.equalsTAGALOG{ pilihbahasa = TAGALOG; } else ifbahasa.getSelectedItem.equalsTAJIK{ pilihbahasa = TAJIK; } else ifbahasa.getSelectedItem.equalsTAMIL{ pilihbahasa = TAMIL; } else ifbahasa.getSelectedItem.equalsTELUGU{ pilihbahasa = TELUGU; } else ifbahasa.getSelectedItem.equalsTHAI{ pilihbahasa = THAI; } else ifbahasa.getSelectedItem.equalsTIBETAN{ pilihbahasa = TIBETAN; } else ifbahasa.getSelectedItem.equalsTURKISH{ pilihbahasa = TURKISH; } else ifbahasa.getSelectedItem.equalsUIGHUR{ pilihbahasa = UIGHUR; } else ifbahasa.getSelectedItem.equalsUKRANIAN{ pilihbahasa = UKRANIAN; } else ifbahasa.getSelectedItem.equalsURDU{ pilihbahasa = URDU; } else ifbahasa.getSelectedItem.equalsUZBEK{ pilihbahasa = UZBEK; } else ifbahasa.getSelectedItem.equalsVIETNAMESE{ pilihbahasa = VIETNAMESE; } else ifbahasa.getSelectedItem.equalsWELSH{ pilihbahasa = WELSH; } else ifbahasa.getSelectedItem.equalsYIDDISH{ pilihbahasa = YIDDISH; } } 334 private void inputUsernameKeyReleasedjava.awt.event.KeyEvent evt { username = new StringinputUsername.getText; } private void formWindowClosingjava.awt.event.WindowEvent evt { if tabbedPane.getTitleAt0.equalsLOGIN{ this.dispose; } else { String metyyu = username + to + chatWith + : + saiaremove; try { streamOut.writeUTFmetyyu; } catch IOException ex { Logger.getLoggerMessage.class.getName.logLevel.SEVERE, null, ex; } String query = delete from mes where userMes LIKE + username + ; try { st.executeUpdatequery; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } stop; timer.stop; try { conn.close; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } try { st.close; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } try { rs.close; } catch SQLException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } this.dispose; } } public void privateMessageManagerString chatWith { 55 5 ifchatWith.equalsIgnoreCaseusername return; ifalreadyChattingchatWith createNewPMchatWith; } public boolean alreadyChattingString chatWith { forint i=0;ipms.size;i++ { Message tmp = Messagepms.geti; iftmp.chattingWith.equalschatWith { tabbedPane.setSelectedIndexi+2; return true; } } return false; } public void createNewPMString chatWith { panel2 = new MessageclientApplication, chatWith, username, socket, streamOut; tabbedPane.addTabchatWith, panel2; tabbedPane.setEnabledAttabbedPane.getTabCount-1, true; tabbedPane.setSelectedIndextabbedPane.getTabCount-1; pms.addElementpanel2; } public void koneksiString server, String db, String username, String password{ try { Class.forNamecom.mysql.jdbc.Driver; conn = null; conn = DriverManager.getConnectionjdbc:mysql: + server + :3306 + db, username, password; if conn == null { JOptionPane.showMessageDialogthis, gagal; } } catch SQLException ex { JOptionPane.showMessageDialogthis, tidak bisa koneksi ke database; Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } catch ClassNotFoundException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } } 667 public static void mainString args[] { java.awt.EventQueue.invokeLaternew Runnable { public void run { new Login.setVisibletrue; } }; } Variables declaration - do not modify private javax.swing.JMenu File; private javax.swing.JLabel SignUp; private javax.swing.JComboBox bahasa; private javax.swing.JPanel chatPanel; public javax.swing.JButton connect; private javax.swing.JPasswordField inputPassword; public javax.swing.JTextField inputUsername; private javax.swing.JLabel jLabel1; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JLabel labelPassword; private javax.swing.JLabel labelUsernName; private javax.swing.JList listUser; private javax.swing.JPanel loginPanel; private javax.swing.JMenuItem menuExit; private javax.swing.JMenuItem menuSignout; private javax.swing.JMenuItem menuSignup; private chat.panelback panelback1; private chat.panelback panelback2; private chat.panelbackk panelbackk1; private javax.swing.JTabbedPane tabbedPane; End of variables declaration } 889 Message import java.sql.; import java.io.; import java.net.; import java.util.logging.; import javax.swing.text.DefaultCaret; public class Message extends javax.swing.JPanel { String chattingWith=null; private Login parent; private Socket socket = null; private DataOutputStream streamOut = null; String text, sql, idcocok, tambahtext; String username = null; public Connection conn; public Statement st; public ResultSet rs; public MessageLogin parent, String chattingWith, String username, Socket socket,DataOutputStream streamOut { initComponents; this.parent = parent; this.username = username; this.chattingWith = chattingWith; this.socket = socket; this.streamOut = streamOut; textmes.appendConnected: + socket + \n; textmes.setEditablefalse; DefaultCaret caret = DefaultCarettextmes.getCaret; caret.setUpdatePolicyDefaultCaret.ALWAYS_UPDATE; } SuppressWarningsunchecked editor-fold defaultstate=collapsed desc=Generated Code private void initComponents { jScrollPane1 = new javax.swing.JScrollPane; textmes = new javax.swing.JTextArea; textInput = new javax.swing.JTextField; panelbackmes1 = new chat.panelbackmes; panelbackmes2 = new chat.panelbackmes; panelbackmes4 = new chat.panelbackmes; panelbackmes5 = new chat.panelbackmes; panelbackmes6 = new chat.panelbackmes; exit = new javax.swing.JButton; ::; panelbackmes7 = new chat.panelbackmes; panelbackmes8 = new chat.panelbackmes; panelbackmes9 = new chat.panelbackmes; panelbackmes10 = new chat.panelbackmes; panelbackmes11 = new chat.panelbackmes; kirim = new javax.swing.JButton; textmes.setColumns20; textmes.setRows5; jScrollPane1.setViewportViewtextmes; textInput.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { textInputActionPerformedevt; } }; javax.swing.GroupLayout panelbackmes1Layout = new javax.swing.GroupLayoutpanelbackmes1; panelbackmes1.setLayoutpanelbackmes1Layout; panelbackmes1Layout.setHorizontalGroup panelbackmes1Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 48, Short.MAX_VALUE ; panelbackmes1Layout.setVerticalGroup panelbackmes1Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 42, Short.MAX_VALUE ; javax.swing.GroupLayout panelbackmes2Layout = new javax.swing.GroupLayoutpanelbackmes2; panelbackmes2.setLayoutpanelbackmes2Layout; panelbackmes2Layout.setHorizontalGroup panelbackmes2Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 48, Short.MAX_VALUE ; panelbackmes2Layout.setVerticalGroup panelbackmes2Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING = .addGap0, 42, Short.MAX_VALUE ; javax.swing.GroupLayout panelbackmes4Layout = new javax.swing.GroupLayoutpanelbackmes4; panelbackmes4.setLayoutpanelbackmes4Layout; panelbackmes4Layout.setHorizontalGroup panelbackmes4Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 48, Short.MAX_VALUE ; panelbackmes4Layout.setVerticalGroup panelbackmes4Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 42, Short.MAX_VALUE ; javax.swing.GroupLayout panelbackmes5Layout = new javax.swing.GroupLayoutpanelbackmes5; panelbackmes5.setLayoutpanelbackmes5Layout; panelbackmes5Layout.setHorizontalGroup panelbackmes5Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 48, Short.MAX_VALUE ; panelbackmes5Layout.setVerticalGroup panelbackmes5Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 42, Short.MAX_VALUE ; exit.setTextClose tab; exit.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { exitActionPerformedevt; } }; javax.swing.GroupLayout panelbackmes6Layout = new javax.swing.GroupLayoutpanelbackmes6; panelbackmes6.setLayoutpanelbackmes6Layout; panelbackmes6Layout.setHorizontalGroup panelbackmes6Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGrouppanelbackmes6Layout.createSequentialGroup .addContainerGap .addComponentexit .addContainerGap9, Short.MAX_VALUE ; panelbackmes6Layout.setVerticalGroup panelbackmes6Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGrouppanelbackmes6Layout.createSequentialGroup .addContainerGap .addComponentexit .addContainerGapjavax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE ; javax.swing.GroupLayout panelbackmes7Layout = new javax.swing.GroupLayoutpanelbackmes7; panelbackmes7.setLayoutpanelbackmes7Layout; panelbackmes7Layout.setHorizontalGroup panelbackmes7Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 48, Short.MAX_VALUE ; panelbackmes7Layout.setVerticalGroup panelbackmes7Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 42, Short.MAX_VALUE ; javax.swing.GroupLayout panelbackmes8Layout = new javax.swing.GroupLayoutpanelbackmes8; panelbackmes8.setLayoutpanelbackmes8Layout; panelbackmes8Layout.setHorizontalGroup panelbackmes8Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 48, Short.MAX_VALUE ; panelbackmes8Layout.setVerticalGroup ?? panelbackmes8Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 42, Short.MAX_VALUE ; javax.swing.GroupLayout panelbackmes9Layout = new javax.swing.GroupLayoutpanelbackmes9; panelbackmes9.setLayoutpanelbackmes9Layout; panelbackmes9Layout.setHorizontalGroup panelbackmes9Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 48, Short.MAX_VALUE ; panelbackmes9Layout.setVerticalGroup panelbackmes9Layout.createParallelGroupjavax.swing.GroupLayout.Alignment. LEADING .addGap0, 42, Short.MAX_VALUE ; javax.swing.GroupLayout panelbackmes10Layout = new javax.swing.GroupLayoutpanelbackmes10; panelbackmes10.setLayoutpanelbackmes10Layout; panelbackmes10Layout.setHorizontalGroup panelbackmes10Layout.createParallelGroupjavax.swing.GroupLayout.Alignment .LEADING .addGap0, 48, Short.MAX_VALUE ; panelbackmes10Layout.setVerticalGroup panelbackmes10Layout.createParallelGroupjavax.swing.GroupLayout.Alignment .LEADING .addGap0, 42, Short.MAX_VALUE ; kirim.setTextSend; kirim.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { kirimActionPerformedevt; } }; javax.swing.GroupLayout panelbackmes11Layout = new javax.swing.GroupLayoutpanelbackmes11; AA panelbackmes11.setLayoutpanelbackmes11Layout; panelbackmes11Layout.setHorizontalGroup panelbackmes11Layout.createParallelGroupjavax.swing.GroupLayout.Alignment .LEADING .addGrouppanelbackmes11Layout.createSequentialGroup .addContainerGap .addComponentkirim, javax.swing.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE .addContainerGap ; panelbackmes11Layout.setVerticalGroup panelbackmes11Layout.createParallelGroupjavax.swing.GroupLayout.Alignment .LEADING .addGroupjavax.swing.GroupLayout.Alignment.TRAILING, panelbackmes11Layout.createSequentialGroup .addContainerGapjavax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE .addComponentkirim .addContainerGap ; javax.swing.GroupLayout layout = new javax.swing.GroupLayoutthis; this.setLayoutlayout; layout.setHorizontalGroup layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADING .addGrouplayout.createSequentialGroup .addContainerGap .addGrouplayout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEA DING, false .addGrouplayout.createSequentialGroup .addComponentpanelbackmes7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addComponentpanelbackmes8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED BBC .addComponentpanelbackmes9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addComponentpanelbackmes10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addComponentpanelbackmes11, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE .addComponenttextInput .addGrouplayout.createSequentialGroup .addComponentpanelbackmes4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addComponentpanelbackmes1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addComponentpanelbackmes2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addComponentpanelbackmes5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addComponentpanelbackmes6, 0, 96, Short.MAX_VALUE .addComponentjScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 312, Short.MAX_VALUE .addContainerGapjavax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE D E F ; layout.setVerticalGroup layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADING .addGrouplayout.createSequentialGroup .addGrouplayout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEA DING .addComponentpanelbackmes2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentpanelbackmes5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addGrouplayout.createParallelGroupjavax.swing.GroupLayout.Alignment.TRA ILING, false .addComponentpanelbackmes4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE .addComponentpanelbackmes1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE .addComponentpanelbackmes6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addComponentjScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.UNRELATED .addComponenttextInput, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED .addGrouplayout.createParallelGroupjavax.swing.GroupLayout.Alignment.TRA ILING G H G .addComponentpanelbackmes7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentpanelbackmes8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentpanelbackmes9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentpanelbackmes10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentpanelbackmes11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addContainerGap ; } editor-fold private void kirimActionPerformedjava.awt.event.ActionEvent evt { text = textInput.getText; tambahtext = username + to + chattingWith + : + text; try { streamOut.writeUTFtambahtext; } catch IOException ex { Logger.getLoggerMessage.class.getName.logLevel.SEVERE, null, ex; } textInput.setText; DefaultCaret caret = DefaultCarettextmes.getCaret; caret.setUpdatePolicyDefaultCaret.ALWAYS_UPDATE; } private void exitActionPerformedjava.awt.event.ActionEvent evt { String metu = username + to + chattingWith + : + saiaecit; try { streamOut.writeUTFmetu; } catch IOException ex { Logger.getLoggerMessage.class.getName.logLevel.SEVERE, null, ex; } I J J } private void textInputActionPerformedjava.awt.event.ActionEvent evt { DefaultCaret caret = DefaultCarettextmes.getCaret; caret.setUpdatePolicyDefaultCaret.ALWAYS_UPDATE; textInput.setFocusabletrue; text = textInput.getText; tambahtext = username + to + chattingWith + : + text; try { streamOut.writeUTFtambahtext; } catch IOException ex { Logger.getLoggerMessage.class.getName.logLevel.SEVERE, null, ex; } textInput.setText; } Variables declaration - do not modify public javax.swing.JButton exit; private javax.swing.JScrollPane jScrollPane1; public javax.swing.JButton kirim; private chat.panelbackmes panelbackmes1; private chat.panelbackmes panelbackmes10; private chat.panelbackmes panelbackmes11; private chat.panelbackmes panelbackmes2; private chat.panelbackmes panelbackmes4; private chat.panelbackmes panelbackmes5; private chat.panelbackmes panelbackmes6; private chat.panelbackmes panelbackmes7; private chat.panelbackmes panelbackmes8; private chat.panelbackmes panelbackmes9; private javax.swing.JTextField textInput; public javax.swing.JTextArea textmes; End of variables declaration } K L M Sign import java.sql.; import java.util.logging.; import javax.swing.; public class Sign extends javax.swing.JFrame { public Connection conn; public Statement st; String firstname, lastname, signuser, signpass, signemail, gender; public Sign { initComponents; setTitle.:TM:.; setIconImagenew javax.swing.ImageIcon getClass. getResourcesun.jpg.getImage; koneksilocalhost,chatting,root,; } SuppressWarningsunchecked editor-fold defaultstate=collapsed desc=Generated Code private void initComponents { panelback1 = new chat.panelback; Submit = new javax.swing.JButton; SignEmail = new javax.swing.JTextField; ComboGender = new javax.swing.JComboBox; SignUser = new javax.swing.JTextField; SignPass = new javax.swing.JPasswordField; SignFirstname = new javax.swing.JTextField; SignLastname = new javax.swing.JTextField; jLabel6 = new javax.swing.JLabel; jLabel3 = new javax.swing.JLabel; jLabel2 = new javax.swing.JLabel; jLabel1 = new javax.swing.JLabel; jLabel5 = new javax.swing.JLabel; jLabel4 = new javax.swing.JLabel; jMenuBar1 = new javax.swing.JMenuBar; jMenu1 = new javax.swing.JMenu; menuExit = new javax.swing.JMenuItem; setDefaultCloseOperationjavax.swing.WindowConstants.DISPOSE_ON_CLOS E; addWindowListenernew java.awt.event.WindowAdapter { public void windowClosingjava.awt.event.WindowEvent evt { formWindowClosingevt; N O P } }; Submit.setTextSubmit; Submit.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { SubmitActionPerformedevt; } }; ComboGender.setModelnew javax.swing.DefaultComboBoxModelnew String[] { Choose, L, P }; ComboGender.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { ComboGenderActionPerformedevt; } }; jLabel6.setTextGender; jLabel3.setTextUsername; jLabel2.setTextLastname; jLabel1.setTextFirstname; jLabel5.setTextE-mail; jLabel4.setTextPassword; javax.swing.GroupLayout panelback1Layout = new javax.swing.GroupLayoutpanelback1; panelback1.setLayoutpanelback1Layout; panelback1Layout.setHorizontalGroup panelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LE ADING .addGroupjavax.swing.GroupLayout.Alignment.TRAILING, panelback1Layout.createSequentialGroup .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.TRAILING .addComponentSubmit .addGrouppanelback1Layout.createSequentialGroup .addContainerGap47, Short.MAX_VALUE Q R S .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.TRAILING .addComponentjLabel2 .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.LEADING .addComponentjLabel4 .addComponentjLabel3 .addComponentjLabel6 .addComponentjLabel5 .addComponentjLabel1 .addGap37, 37, 37 .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.LEADING .addComponentSignFirstname, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.LEADING .addComponentSignEmail, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE .addComponentComboGender, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentSignPass, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE .addComponentSignUser, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE .addComponentSignLastname, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE .addGap92, 92, 92 ; panelback1Layout.setVerticalGroup panelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LE ADING .addGrouppanelback1Layout.createSequentialGroup .addGap51, 51, 51 .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.BASELINE .addComponentjLabel1 T U .addComponentSignFirstname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addGap15, 15, 15 .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.BASELINE .addComponentSignLastname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentjLabel2 .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.UNRELATED .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.LEADING .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.BASELINE .addComponentSignUser, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentjLabel3 .addGrouppanelback1Layout.createSequentialGroup .addGap32, 32, 32 .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.BASELINE .addComponentSignPass, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentjLabel4 .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.UNRELATED .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.BASELINE .addComponentSignEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentjLabel5 V W X .addGap14, 14, 14 .addGrouppanelback1Layout.createParallelGroupjavax.swing.GroupLayout.Alig nment.BASELINE .addComponentComboGender, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE .addComponentjLabel6 .addPreferredGapjavax.swing.LayoutStyle.ComponentPlacement.RELATED, 36, Short.MAX_VALUE .addComponentSubmit .addGap25, 25, 25 ; jMenu1.setTextFile; menuExit.setTextExit; menuExit.addActionListenernew java.awt.event.ActionListener { public void actionPerformedjava.awt.event.ActionEvent evt { menuExitActionPerformedevt; } }; jMenu1.addmenuExit; jMenuBar1.addjMenu1; setJMenuBarjMenuBar1; javax.swing.GroupLayout layout = new javax.swing.GroupLayoutgetContentPane; getContentPane.setLayoutlayout; layout.setHorizontalGroup layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADING .addComponentpanelback1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE ; layout.setVerticalGroup layout.createParallelGroupjavax.swing.GroupLayout.Alignment.LEADING .addComponentpanelback1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE Y Z ; pack; } editor-fold public void koneksiString server, String db, String username, String password{ try { Class.forNamecom.mysql.jdbc.Driver; conn = DriverManager.getConnectionjdbc:mysql: + server + :3306 + db, username, password; if conn == null { JOptionPane.showMessageDialogthis, gagal; } } catch SQLException ex { JOptionPane.showMessageDialogthis, tidak bisa koneksi ke database; Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } catch ClassNotFoundException ex { Logger.getLoggerLogin.class.getName.logLevel.SEVERE, null, ex; } } private void ComboGenderActionPerformedjava.awt.event.ActionEvent evt { ifComboGender.getSelectedItem.equalsL{ gender = L; } else ifComboGender.getSelectedItem.equalsP{ gender = P; } } private void SubmitActionPerformedjava.awt.event.ActionEvent evt { if SignFirstname.getText.equals || SignLastname.getText.equals || SignUser.getText.equals || SignPass.getText.equals || SignEmail.getText.equals || ComboGender.getSelectedItem.equalsChoose{ JOptionPane.showMessageDialogthis, You must fill out of the blank; } else { try { firstname = SignFirstname.getText; lastname = SignLastname.getText; signuser = SignUser.getText; signpass = SignPass.getText; signemail = SignEmail.getText; String sql = insert into identitasusername,firstname,lastname,password, email,gender + values + signuser + , + firstname + + , + lastname + , [ \ ] + + signpass + , + signemail + , + gender + ; st = conn.createStatement; st.executesql; } catch SQLException ex { Logger.getLoggerSign.class.getName.logLevel.SEVERE, null, ex; } SignFirstname.setText; SignLastname.setText; SignUser.setText; SignPass.setText; SignEmail.setText; JOptionPane.showMessageDialogthis, Your data is saved; } } private void menuExitActionPerformedjava.awt.event.ActionEvent evt { try { this.dispose; conn.close; st.close; } catch SQLException ex { Logger.getLoggerSign.class.getName.logLevel.SEVERE, null, ex; } } private void formWindowClosingjava.awt.event.WindowEvent evt { this.dispose; } public static void mainString args[] { java.awt.EventQueue.invokeLaternew Runnable { public void run { new Sign.setVisibletrue; } }; } Variables declaration - do not modify private javax.swing.JComboBox ComboGender; private javax.swing.JTextField SignEmail; private javax.swing.JTextField SignFirstname; private javax.swing.JTextField SignLastname; private javax.swing.JPasswordField SignPass; private javax.swing.JTextField SignUser; private javax.swing.JButton Submit; private javax.swing.JLabel jLabel1; _ ` private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JMenu jMenu1; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem menuExit; private chat.panelback panelback1; End of variables declaration } a b a ThreadC import java.net.; import java.io.; public class ThreadC extends Thread { private Socket socket = null; private Login client = null; private DataInputStream streamIn = null; public ThreadCLogin parent, Socket _socket { client = parent; socket = _socket; open; start; } public void open { try { streamIn = new DataInputStreamsocket.getInputStream; } catchIOException ioe { System.out.printlnError getting input stream: + ioe; client.stop; } } public void close { try { if streamIn = null streamIn.close; } catchIOException ioe { System.out.printlnError closing input stream: + ioe; } } public void run { while true { try { client.handlestreamIn.readUTF; } catchIOException ioe { System.out.printlnListening error: + ioe.getMessage; client.stop; } } }} c d e Lampiran 3. Validasi Instrumen f g g h i j k l m Lampiran 4. Validasi Aplikasi VALIDASI APLIKASI Aplikasi Translator Messenger Berbasis Java dan Google Translate API n op o qrs t : Drs. Totok Sukardiyono, M.T. Pekerjaan : Dosen Pend. Teknik Informatika UNY

A. PETUNJUK