Enrera
Mòdul 7
Iniciació a la programació en Java
  Exercicis
   
 
 
  Exercici 1: Boles amb preferència.
   
  Reviseu el codi del programa amb multifils, BolaFils.java, de la pràctica 1. Anomeneu-lo M7ex01.java i afegiu-li un nou botó amb l'etiqueta "Alta Prioritat" que ens generi una bola igual que la del programa, però en un fil de prioritat màxima. Mireu si sou capaços d'aconseguir que pinti la bola d'un color diferent de la de prioritat normal.
   
  Exercici 2: Saber l'hora amb Java
   
  Repasseu la pràctica de connexió via telnet al servidor d'hora del NIST (pràctica 3). Feu un petit programa escrit en Java que faci la mateixa feina que la comanda Telnet. Poseu-li el nom M7ex02.java.
   
  Exercici 3: Un xat (sockets)
   
  Es tracta de vestir el xat del projecte Xat (pràctica 3 d'aquest mòdul) amb una GUI per tal que tingui aquest aspecte:
   
   
  El codi font per a la GUI és aquest: ara falta completar-lo per tal que actui com a programa de xat entre dues màquines:
   
 
/*
* @(#)M6ex03.java 1.0 02/11/09
*
* You can modify the template of this file in the
* directory ..\JCreator\Templates\Template_1\Project_Name.java
*
* You can also create your own project template by making a new
* folder in the directory ..\JCreator\Template\. Use the other
* templates as examples.
*
*/
//package myprojects.m6ex03;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

class M6ex03 extends Frame {
    int numPortLocal,numPortRemot;
    String adrRemota;
    TextArea textosXat;
    boolean connectat;
    ServerSocket serverSocket;
    Socket clientSocket;
    PanelConnexions panelConnexions;
    PanelEnviar panelEnviar;
    RebreThread rebreThread;
    public M6ex03() {
        panelConnexions=new PanelConnexions(this);
        add(panelConnexions,BorderLayout.NORTH);
        panelEnviar=new PanelEnviar(this);
        add(panelEnviar,BorderLayout.SOUTH);
        textosXat=new TextArea(30,60);
        textosXat.setFont(new Font("Monospaced",Font.PLAIN,18));
        textosXat.setEditable(false);
        textosXat.setEnabled(false);
        add(textosXat,BorderLayout.CENTER);
        rebreThread=new RebreThread(this);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });
    }

    public static void main(String args[]) {
        System.out.println("Starting M6ex03...");
        M6ex03 mainFrame = new M6ex03();
        mainFrame.setSize(620, 500);
        mainFrame.setTitle("Xat");
        mainFrame.setVisible(true);
    }
    public void escolta () {
            if (serverSocket!=null) {
                    try {
                        serverSocket.close();
                        serverSocket=null;
                    } catch (IOException e) {
                    }
            }
            try {
                serverSocket=new ServerSocket(numPortLocal);
                System.out.println("Escoltant al port: "+
                                    numPortLocal);
                panelConnexions.adrRemot.setEnabled(true);
                panelConnexions.portRemot.setEnabled(true);
                panelConnexions.connecta.setLabel("Connecta");
                panelConnexions.connecta.setEnabled(true);
            } catch (IOException e) {
                System.out.println("No puc escoltar al port: "+
                                    numPortLocal);
                System.exit(0);
            }
    }

    public void connecta () {
        rebreThread=new RebreThread(this);
        rebreThread.start();
        textosXat.setEnabled(true);
        panelEnviar.missatge.setEnabled(true);
        panelEnviar.envia.setEnabled(true);
        panelEnviar.missatge.requestFocus();
    }

    public void desconnecta () {
        rebreThread=null;
        textosXat.setEnabled(false);
        panelEnviar.missatge.setEnabled(false);
        panelEnviar.envia.setEnabled(false);
    }

    public void enviaMissatge () {
        Socket outSocket=null;
        String text=panelEnviar.missatge.getText();
            if (text.length()==0) {
                return;
            }
            try {

              // Posar el codi que calgui...

            } catch (IOException e) {
                System.out.println("No puc conectar amb "+
                                   adrRemota+
                                   " al port "+
                                   numPortRemot);
                return;
            }
    }

    public void afegeixMissatge (String text) {
        text=tallaEnLinies(text);
        textosXat.append(text);
    }

    public String tallaEnLinies (String text) {
        String ambCR="";
        String paraula="";
        text=text+" ";
        int longitud=text.length();
        int limit=textosXat.getColumns();
        int chars=0;
            for (int i=0;i<longitud;i++) {
                String aquestCaracter=text.substring(i,i+1);
                paraula=paraula+aquestCaracter;
                chars++;
                    if (aquestCaracter.equals(" ")) {
                            if (chars>limit) {
                                ambCR=ambCR+"\n";
                                chars=paraula.length()+1;
                            }
                        ambCR=ambCR+paraula;
                        paraula="";
                    }
            }
        return ambCR+"\n";
    }

}
class PanelConnexions extends Panel implements ActionListener {

    M6ex03 mainAp;
    Button obre,connecta;
    TextField portLocal,adrRemot,portRemot;

    public PanelConnexions (M6ex03 xt) { //constructor
        super();
        mainAp=xt;
        setLayout(new BorderLayout());
        Panel panelDadesConnexio=new Panel();
        panelDadesConnexio.setLayout(new GridLayout(2,1));
        Panel panelLocal=new Panel();
        panelLocal.setLayout(new FlowLayout(FlowLayout.RIGHT));
        panelLocal.add(new Label("Port local: ",Label.RIGHT));
        portLocal=new TextField("8086");
        portLocal.setEnabled(true);
        panelLocal.add(portLocal);
        panelDadesConnexio.add(panelLocal);
        Panel panelRemot=new Panel();
        panelRemot.setLayout(new FlowLayout(FlowLayout.RIGHT));
        panelRemot.add(new Label("Adreça remota: ",Label.RIGHT));
        adrRemot=new TextField("192.168.0.151");
        adrRemot.setEnabled(false);
        panelRemot.add(adrRemot);
        panelRemot.add(new Label("Port remot: ",Label.RIGHT));
        portRemot=new TextField("8086");
        portRemot.setEnabled(false);
        panelRemot.add(portRemot);
        panelDadesConnexio.add(panelRemot);
        add(panelDadesConnexio,BorderLayout.CENTER);
        Panel panelBotonsConnexio=new Panel();
        panelBotonsConnexio.setLayout(new GridLayout(2,1));
        obre=new Button("Obre la connexió");
        obre.addActionListener(this);
        obre.setEnabled(true);
        panelBotonsConnexio.add(obre);
        connecta=new Button("Connecta");
        connecta.addActionListener(this);
        connecta.setEnabled(false);
        panelBotonsConnexio.add(connecta);
        add(panelBotonsConnexio,BorderLayout.EAST);
        mainAp.connectat=false;
    }

    public void actionPerformed(ActionEvent e) {
        Object obj=e.getSource();
            if (obj instanceof Button) {
                Button bot=(Button)obj;
                    if (bot==obre) {
                        mainAp.numPortLocal=Integer.parseInt(
                                                 portLocal.getText()
                                                 );
                        mainAp.escolta();
                    } else if (bot==connecta) {
                            if (mainAp.connectat) {
                                portLocal.setEnabled(true);
                                obre.setEnabled(true);
                                adrRemot.setEnabled(false);
                                portRemot.setEnabled(false);
                                connecta.setLabel("Connecta");
                                connecta.setEnabled(false);
                                mainAp.desconnecta();
                                mainAp.connectat=false;
                            } else {
                                mainAp.adrRemota=adrRemot.getText();
                                mainAp.numPortRemot=Integer.parseInt(
                                                 portRemot.getText()
                                                         );
                                portLocal.setEnabled(false);
                                obre.setEnabled(false);
                                adrRemot.setEnabled(false);
                                portRemot.setEnabled(false);
                                connecta.setLabel("Desconnecta");
                                mainAp.connecta();
                                mainAp.connectat=true;
                            }
                    }
            }
    }

}

class PanelEnviar extends Panel implements ActionListener {

    M6ex03 mainAp;
    Button envia;
    TextField missatge;

    public PanelEnviar (M6ex03 xt) {
        super();
        mainAp=xt;
        setLayout(new BorderLayout());
        missatge=new TextField();
        missatge.setEnabled(false);
        add(missatge,BorderLayout.CENTER);
        envia=new Button("Envia...");
        envia.addActionListener(this);
        envia.setEnabled(false);
        add(envia,BorderLayout.EAST);
    }

    public void actionPerformed(ActionEvent e) {
        Object obj=e.getSource();
            if (obj instanceof Button) {
                Button bot=(Button)obj;
                    if (bot==envia) {
                        mainAp.enviaMissatge();
                        missatge.requestFocus();
                    }
            }
    }

}

class RebreThread extends Thread {

    // Posar el codi que calgui...

}

   
  La vostra feina és, doncs, posar el codi que falta. A l'acabar, comprimiu l'aplicació en un fitxer M7ex03.jar autoexecutable.
   
  Exercici 4:
   
 

Modifiqueu el programa GestioUsuaris.java de la pràctica 5 afegint-hi aquesta cinquena opció:

5 - Llistar els usuaris el primer cognom dels quals sigui igual a ?

Anomeneu-lo M7ex04.java.

   
  Tramesa al vostre tutor:
   
  Comprimiu les quatre carpetes M7ex01, M7ex02, M7ex03 i M7ex04 en un fitxer ZIP, que es dirà <nom_usuari>_m7.zip i trameteu-lo al vostre tutor.
 
Amunt