/* * ClientUI.java * Userinterface för chatklient. * * Karl-Adam Karlsson * 06-10-12 * */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; //import java.io.*; import java.net.*; public class ClientUI extends JFrame { // Variabler private JTextField messText; private JList clientList; private JScrollPane c; private JTextArea messArea; private JScrollPane jScrollPane2; private JButton challengeButt; private JPanel contentPane; private JScrollPane clientPane; public Client me; Thread handlerThread; DefaultListModel myModel; boolean playing; /* *Konstruktor, anropar initialize components som initializar. */ public ClientUI(String name, String key, String connTo) { super(); initializeComponent(); this.setVisible(true); playing = false; //Skapar vår klient, dvs oss själva. me=null; try{ me = new Client(name, key, InetAddress.getLocalHost() ); }catch(UnknownHostException uHe){ uHe.printStackTrace(); System.exit(1); } if(key!=null){ //Vi vill använda en speciell nyckel för kryptering }else{ //Standar för kryptering } ioHandler myHandler = new ioHandler(this,key); handlerThread = new Thread(myHandler); me.setHandler( myHandler ); addUser(me); handlerThread.start(); if(connTo!=null&&connTo!=""&&connTo!=" "){ // Vi vill connecta till någon direkt. me.getHandler().connectTo(connTo); }else{ // VI startar utan att connecta till ngn, vi skapar oss själva bara och lägger // till i listan på clients, vilket är gjort redan } } /** * Anropas från konstruktorn, initialiserar alla komponenter. */ private void initializeComponent() { messText = new JTextField(); myModel = new DefaultListModel(); clientList = new JList(myModel); clientPane = new JScrollPane(); messArea = new JTextArea(); jScrollPane2 = new JScrollPane(); challengeButt = new JButton(); contentPane = (JPanel)this.getContentPane(); // messText // messText.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { messText_actionPerformed(e); } }); // clientList // Listan på anslutna klienter clientList.setCellRenderer(new MyRenderer()); clientList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { clientList_valueChanged(e); } }); // När vi stänger fönstret skall vi skicka disconnect till alla this.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(WindowEvent winEvt) { Message disMess = new Message(Message.MESSAGE_DISCONNECT); disMess.setData(me.getName()); me.getHandler().sendMess(disMess); System.exit(0); } }); // clientPane // Scrollpane för clien7List clientPane.setViewportView(clientList); // messArea // Här skriver vi ut meddelandena. messArea.setEditable(false); // jScrollPane2 // Scroll för messArea jScrollPane2.setViewportView(messArea); // challengeButt // Knapp för att skicka utmaning (spelet), till markerad användare i listan. challengeButt.setText("Challenge"); challengeButt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { challengeButt_actionPerformed(e); } }); // contentPane // contentPane.setLayout(null); contentPane.setBackground(new Color(104, 121, 175)); contentPane.setForeground(new Color(115, 154, 208)); addComponent(contentPane, clientPane, 525,10,155,391); addComponent(contentPane, messText, 8,435,490,22); addComponent(contentPane, jScrollPane2, 8,30,490,400); addComponent(contentPane, challengeButt, 525,404,155,30); // ClientUI // this.setTitle("P2P chat, Now with encryption!"); this.setLocation(new Point(100, 100)); this.setSize(new Dimension(692, 496)); //this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); this.setResizable(false); } /** Add Component Without a Layout Manager (Absolute Positioning) */ private void addComponent(Container container,Component c,int x,int y,int width,int height) { c.setBounds(x,y,width,height); container.add(c); } /* * Handler för messText */ private void messText_actionPerformed(ActionEvent e) { Message aMess = new Message(Message.MESSAGE_MESSAGE); aMess.setData( ("<" + me.getName() + "> " + messText.getText() ), null, null ); me.getHandler().sendMess(aMess); printMessage("<"+ me.getName() + "> " + messText.getText()); messText.setText(""); } /* * Används vid utmaning i Wormspelet. * Skapar meddelandedialog. * */ public void createGameDialogue(Message aMessage){ //SKAPAR EN JOPTIONPANE if(playing==false){ Object[] options = {"Yes", "No"}; int n = JOptionPane.showOptionDialog(this, "You have Recevied a Worm challenge from " + aMessage.getText(),"Accept?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]); if(n == JOptionPane.OK_OPTION ){ //SVARA UTMANAREN OCH SPELA Message chRep = new Message(Message.MESSAGE_CH_REPLY); //System.out.println("YES, LETS PLAY!"); chRep.setData(me.getName(), me.getAddress(),aMessage.getSenderIP()); chRep.setData("OK"); System.out.println("DATA TO SEND: " +chRep.getText()); me.getHandler().sendMess(chRep); playing = true; //STARTA ETT SPEL new Draw(0, aMessage.getSenderIP().getHostAddress(), this ); } else{ //SVARAR NEJ. Message chRep = new Message(Message.MESSAGE_CH_REPLY); chRep.setData(me.getName(), me.getAddress(),aMessage.getSenderIP()); chRep.setData("NO"); me.getHandler().sendMess(chRep); } }//END OF FIRST IF else{//VI SPELAR REDAN, svarar NEJ AUTOMAGISKT Message chRep = new Message(Message.MESSAGE_CH_REPLY); chRep.setData(me.getName(), me.getAddress(),aMessage.getSenderIP()); chRep.setData("NO"); me.getHandler().sendMess(chRep); } } /* * EventHandler för listan. * */ private void clientList_valueChanged(ListSelectionEvent e) { System.out.println("\nclientList_valueChanged(ListSelectionEvent e) called."); if(!e.getValueIsAdjusting()) { Object o = clientList.getSelectedValue(); } } /* * Eventhandler för knappen som används för att utmana andra chattare * på spelet. * */ private void challengeButt_actionPerformed(ActionEvent e) { Client cl = (Client)clientList.getSelectedValue(); if( cl !=null && !cl.equals(me) ){ // Client cl = (Client)clientList.getSelectedValue(); Message aChallenge = new Message(Message.MESSAGE_CHALLENGE); //System.out.println("CHALLENGEING: "+cl.getAddress()); aChallenge.setData(me.getName(), me.getAddress(), cl.getAddress() ); me.getHandler().sendMess(aChallenge); } } /* * Skriver ut toPrint i chatfönstret * @param String toPrint, The String to print in the chatwindow. */ public void printMessage(String toPrint){ messArea.append(toPrint + "\n"); } /* * Adds a user to the list of users. * @param Client aClient the Client to add. */ public void addUser(Client aClient){ myModel.addElement(aClient); } /* * Removes a user from the connected list * */ public void remUser(String aName){ for(int a = 0; a new ClientUI(args[2], args[3], args[4]); }else if(args.length==3&&args[0]!=null&&args[1]!=null&args[2]!=null){ if(args[0].equals("-c")){ //Startades med: java -jar p2pChat.jar -c new ClientUI(args[1], null, args[2]); } else if(args[0].equals("-s")&&args[0]!=null&&args[1]!=null&args[2]!=null){ //Startades med: java -jar p2pChat.jar -s new ClientUI(args[1], args[2], null); } }else if(args.length==1&&args!=null){ //Startades med: java -jar p2pChat.jar new ClientUI(args[0], null, null); }else{ } } }//end of Class