Autor
|
Tema: Aplicacion en swing para mostrar el tiempo de provincias y poblaciones (Leído 2,686 veces)
|
kikian94
Desconectado
Mensajes: 66
|
hola, estoy diseñando una aplicacion en swing que se tiene que conectar a la AEMET y descargar los datos de las poblaciones que previamente se le han añadido, el problema que tengo es con los componentes. En primer lugar este es el codigo: package principal; import java.awt.*; import java.awt.event.*; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import Poblacion.VentanaBorrarPoblacion; import Poblacion.VentanaCrearPoblacion; import paa.provincias.GestorAEMET; import paa.provincias.GestorAEMETException; import paa.provincias.IPoblacion; import paa.provincias.IPoblacionAEMET; import paa.provincias.IPrediccion; /** * Fichero: InterfazAWT_AEMET.java Clase que implementa la Interfaz Gráfica * AEMET con awt. * * @author PAA * @version 1.0 */ public class InterfazAWT_AEMET extends JFrame { /** * */ private static final long serialVersionUID = 502635761186556414L; private static final String FICHERO = "almacen.dat"; private AlmacenPoblaciones almacen; // private IAlmacenPoblaciones almacenPoblaciones; private List listaPoblaciones = new List(); private List listaPredicciones = new List(); private List listaProvincias = new List(); private InterfazAWT_AEMET gui; private GestorAEMET gestor = new GestorAEMET(); private Aviso aviso; /** * Constructor. * * @throws GestorAEMETException */ public InterfazAWT_AEMET (String titulo, int ancho, int alto ) { super(titulo); setSize(ancho, alto); setLocationRelativeTo(null); setLayout (new BorderLayout()); // Layout de la aplicación, podría ser otro almacen = RecuperarAlmacenPoblaciones(); initComponents(); JFrame. setDefaultLookAndFeelDecorated(true); } public AlmacenPoblaciones RecuperarAlmacenPoblaciones() { // Recuperamos el almacén AlmacenPoblaciones almacenPoblaciones1 = new AlmacenPoblaciones(); if (almacenPoblaciones1.recuperar(FICHERO)){ Icon icono = new ImageIcon(getClass (). getResource("/iconos/check.png")); JOptionPane. showMessageDialog(null, "Recuperado el almacen del fichero " + FICHERO, "Recuperado", JOptionPane. INFORMATION_MESSAGE,icono ); }else{ JOptionPane. showMessageDialog(null, "No se ha podido recuperar el almacen del fichero" + FICHERO, "Error", JOptionPane. ERROR_MESSAGE); }return almacenPoblaciones1; } private void initComponents() { // Boton salir por defecto this. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); setJMenuBar(addJMenuBar()); //Create a split pane with the two scroll panes in it. splitPane.setDividerLocation(150); splitPane.setDividerSize(10); splitPane.setOneTouchExpandable(true); /* // Provide minimum sizes for the two components in the split pane Dimension minimumSize = new Dimension(100, 50); addPanelIzquierda().setMinimumSize(minimumSize); addpredicciones().setMinimumSize(minimumSize); // Set the initial location and size of the divider // Provide a preferred size for the split pane splitPane.setPreferredSize(new Dimension(400, 200));*/ } // Sitúo los menús desplegables // Creo el menú Archivo crearCargar.addActionListener(new Controller()); crearGuardar.addActionListener(new Controller()); salir.addActionListener(new Controller()); menuArchivo.add(crearCargar); menuArchivo.add(crearGuardar); menuArchivo.add(salir); // Creo el menú Provincias crearProvincias.addActionListener(new Controller()); borrarProvincias.addActionListener(new Controller()); menuProvincias.add(crearProvincias); menuProvincias.add(borrarProvincias); // Creo el menu Poblaciones crearPoblacion.addActionListener(new Controller()); borrarPoblacion.addActionListener(new Controller()); ordenarNombre.addActionListener(new Controller()); ordenarHabitantes.addActionListener(new Controller()); modPoblacion.addActionListener(new Controller()); movPoblacion.addActionListener(new Controller()); menuPoblaciones.add(crearPoblacion); menuPoblaciones.add(borrarPoblacion); menuPoblaciones.add(ordenarNombre); menuPoblaciones.add(ordenarHabitantes); menuPoblaciones.add(modPoblacion); menuPoblaciones.add(movPoblacion); // Creo el menú de ayuda acercaDe.addActionListener(new AcercaDe()); ayuda.add(acercaDe); // Crea el barraDeMenu.add(menuArchivo); barraDeMenu.add(menuProvincias); barraDeMenu.add(menuPoblaciones); barraDeMenu.add(ayuda); return barraDeMenu; } // Sitúo la línea de botones lineaDeBotones. setBackground(new Color(200, 100, 100)); // Boton crear provincia Icon Iprovincia = new ImageIcon(getClass (). getResource("/iconos/provincia.png")); proCrear.addActionListener(new Controller()); // Boton crear poblacion Icon Ipoblacion = new ImageIcon(getClass (). getResource("/iconos/poblacion.png")); poCrear.addActionListener(new Controller()); // Boton actualizar prediccion Icon actualizar = new ImageIcon(getClass (). getResource("/iconos/actualizar.png")); JButton aPrediccion = new JButton("Actualizar Predicción",actualizar ); aPrediccion.setToolTipText("Click para actualizar las predicciones"); aPrediccion.addActionListener(new Controller()); // Añadir los botones a la barra lineaDeBotones.add(proCrear); lineaDeBotones.add(poCrear); lineaDeBotones.add(aPrediccion); return lineaDeBotones; } private JTree addPanelIzquierda () { // Construccion del arbol // Construccion de los datos del arbol for(String s : almacen. getProvincias()){ int j = 0; modelo.insertNodeInto(provincia, provinciasPrincipal, j); j++; for(IPoblacion i : almacen.getPoblaciones(s)){ int x = 0; modelo.insertNodeInto(poblacion, provincia, x); x++; } } return tree; } private JPanel addpredicciones () { // Creamos el panel de las predicciones return predicciones; } private JPanel addlineaEstado () { // Sitúo la línea de estado lineaDeEstado. setBackground(new Color(0, 80, 80)); ventanaDeeventos. setForeground(new Color(200, 200, 60)); lineaDeEstado.add(ventanaDeeventos); return lineaDeEstado; } private void guardarAntesDeSalir() { // Guardar almacen almacen.guardar(FICHERO); System. out. println("Gracias por utilizar nuestro programa"); } String nombre = e. getActionCommand(); EvaluarAccion(nombre); } public void EvaluarAccion (String accion ) { switch (accion) { case "Guardar": almacen.guardar(FICHERO); JOptionPane. showMessageDialog(null, "El almacen ha sido guardado", "Guardado", DISPOSE_ON_CLOSE ); break; case "Cargar": almacen = RecuperarAlmacenPoblaciones(); break; case "Salir": break; case "Crear provincia": if((crearProvincia != null)&&(!crearProvincia.equals(""))){ almacen.addProvincia(crearProvincia); }else{ JOptionPane. showMessageDialog(null, "Error al crear provincia", "Error", DISPOSE_ON_CLOSE ); } break; case "Borrar provincia": if((borrarProvincia != null)&&(!borrarProvincia.equals(""))){ almacen.delProvincia(borrarProvincia); }else{ JOptionPane. showMessageDialog(null, "Error al borrar provincia", "Error", DISPOSE_ON_CLOSE ); } break; case "Crear poblacion": break; case "Borrar poblacion": new VentanaBorrarPoblacion(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true); break; case "Ordenar por nombre": /*almacen.ordenarPor(listaProvincias.getSelectedItem(), almacen.ORDENARPORNOMBRE); listaProvincias.removeAll(); Iterator<IPoblacion> i = almacen.getPoblaciones(listaProvincias.getSelectedItem()).iterator(); while(i.hasNext()){ i.next(); listaProvincias.add(i.next().getNombre()); }*/ break; case "Ordenar por habitantes": /*almacen.ordenarPor(listaProvincias.getSelectedItem(), almacen.ORDENARPORHABITANTES); listaProvincias.removeAll(); for(IPoblacion p : almacen.getPoblaciones(listaProvincias.getSelectedItem())){ listaProvincias.add(p.getNombre()); }*/ break; case "Modificar poblacion": break; case "Mover poblacion": break; case "Actualizar Predicción": IPoblacion poblacion = almacen.getPoblacion(listaProvincias.getSelectedItem(), listaPoblaciones.getSelectedItem()); try { listaPredicciones.removeAll(); for(IPrediccion p : gestor.getPredicciones((IPoblacionAEMET) poblacion)){ listaPredicciones.add(p.getFecha() + " : " + p.getEstadoCielo() + " : " + p.getTemperaturaMaxima() + " : " + p.getTemperaturaMinima()); } } catch (GestorAEMETException e) { new Aviso(gui,e.getMessage()); } break; case "Acerca de" : new VentanaAcercaDe(gui); break; } } } /** * Clase que implementa la acción del menú "acerca de". */ VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe( InterfazAWT_AEMET.this); ventanaAcercaDe.setVisible(true); } }// Acerca de /** * Método main. * @throws GestorAEMETException */ public static void main (String[] args ) throws GestorAEMETException { InterfazAWT_AEMET mimarco = new InterfazAWT_AEMET("Gestor AEMET", 1000, 500); mimarco.setDefaultCloseOperation(DISPOSE_ON_CLOSE); mimarco.setVisible(true); } // Main }
el cual dibuja esto: tengo el jsplitpane definido para que actue entre el jtree y el panel predicciones el cual tengo que sustituir por una jtable pero parece que no actua por que no aparece en la aplicacion. tambien en los dialogos de la clase controller: if((borrarProvincia != null)&&(!borrarProvincia.equals(""))){ almacen.delProvincia(borrarProvincia); }else{ JOptionPane. showMessageDialog(null, "Error al borrar provincia", "Error", DISPOSE_ON_CLOSE ); }
quiero modificar lo que pone en los botones para que cuando se pulsa el boton añadir provincia en vez de salir los botones aceptar y cancelar, salgan crear y cancelar tambien necesito que al pulsar en una poblacion del jtree se cargue en la tabla de la derecha los datos de las predicciones si ya hubiera pulsado el boton actualizar prediccion al menos una vez para evitar que al pulsar en cada poblacion conecte con AEMET Y utilize mas ancho de banda y por ultimo nos han dicho que la utilizacion del springlayout mejora la interfaz pero no me apaño muy bien a la hora de usarlo con los dialogos crear poblacion
|
|
|
En línea
|
|
|
|
kikian94
Desconectado
Mensajes: 66
|
he conseguido solucionar el problema del jsplit y ya funciona, ahora viene lo que me queda, la tabla, la cual me esta dando muchos quebraderos de cabeza, tengo esto: y tengo que llegar a esto: y ahora explico como debe de hacerse: El boton actualizar prediccion ha de utilizar un paquete .jar que nos dan pedefinido y en el cual hay 2 metodos necesarios, el primero, getPredicciones que me devuelve una lista de las predicciones con una semana de margen, las cuales tengo que colocar en cada casilla de la tabla al darle al boton actualizar y ademas colocar el icono del tiempo en funcion de la prediccion que tambien viene dado por el metodo getIcono. pero hay un pero y es que si ya se ha dado al boton actualizar y se vuelve a pulsar debe de mostrar la tabla que ya habia la primera vez y no volver a actualizar ya que al no haber datos que actualizar seria un malgasto de internet, solo debe de actuar el boton actualizar cuando haya pasado el tiempo suficiente para que haya nuevas predicciones, es decir 1 dia. hasta aqui lo que debe de hacer, tengo todo pero la tabla no consigo hacerla, para empezar no soy capaz de dibujar los nombres de las columnas, he copiado el codigo de las columnas predefinido para probar pero no se como voy a meter en la tabla los datos de las predicciones y el icono, pongo el codigo que tengo hasta ahora: clase principal: package principal; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import javax.swing.border.Border; import javax.swing.border.CompoundBorder; import javax.swing.border.EtchedBorder; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableModel; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; import Poblacion.VentanaBorrarPoblacion; import Poblacion.VentanaCrearPoblacion; import paa.provincias.GestorAEMET; import paa.provincias.GestorAEMETException; import paa.provincias.IPoblacion; import paa.provincias.IPoblacionAEMET; import paa.provincias.IPrediccion; /** * Fichero: InterfazAWT_AEMET.java Clase que implementa la Interfaz Gráfica * AEMET con awt. * * @author PAA * @version 1.0 */ public class InterfazAWT_AEMET extends JFrame { /** * */ private static final long serialVersionUID = 502635761186556414L; private static final String FICHERO = "almacen.dat"; private AlmacenPoblaciones almacen; // private IAlmacenPoblaciones almacenPoblaciones; private List listaPoblaciones = new List(); private List listaPredicciones = new List(); private List listaProvincias = new List(); private InterfazAWT_AEMET gui; private GestorAEMET gestor = new GestorAEMET(); /** * Constructor. * * @throws GestorAEMETException */ public InterfazAWT_AEMET (String titulo, int ancho, int alto ) { super(titulo); setSize(ancho, alto); setLocationRelativeTo(null); setLayout (new BorderLayout()); // Layout de la aplicación, podría ser otro almacen = RecuperarAlmacenPoblaciones(); initComponents(); JFrame. setDefaultLookAndFeelDecorated(true); } public AlmacenPoblaciones RecuperarAlmacenPoblaciones() { // Recuperamos el almacén AlmacenPoblaciones almacenPoblaciones1 = new AlmacenPoblaciones(); if (almacenPoblaciones1.recuperar(FICHERO)){ Icon icono = new ImageIcon(getClass (). getResource("/iconos/check.png")); JOptionPane. showMessageDialog(null, "Recuperado el almacen del fichero " + FICHERO, "Recuperado", JOptionPane. INFORMATION_MESSAGE,icono ); }else{ JOptionPane. showMessageDialog(null, "No se ha podido recuperar el almacen del fichero" + FICHERO, "Error", JOptionPane. ERROR_MESSAGE); }return almacenPoblaciones1; } public void initComponents() { // Boton salir por defecto this. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); setJMenuBar(addJMenuBar()); //Creamos el splitpanel y lo colocamos en medio del jtree y la tabla, despues lo añadimos al Jframe splitPane.setOneTouchExpandable(true); splitPane.setDividerLocation(100); splitPane.setDividerSize(10); } // Sitúo los menús desplegables // Creo el menú Archivo crearCargar.addActionListener(new Controller()); crearGuardar.addActionListener(new Controller()); salir.addActionListener(new Controller()); menuArchivo.add(crearCargar); menuArchivo.add(crearGuardar); menuArchivo.add(salir); // Creo el menú Provincias crearProvincias.addActionListener(new Controller()); borrarProvincias.addActionListener(new Controller()); menuProvincias.add(crearProvincias); menuProvincias.add(borrarProvincias); // Creo el menu Poblaciones crearPoblacion.addActionListener(new Controller()); borrarPoblacion.addActionListener(new Controller()); ordenarNombre.addActionListener(new Controller()); ordenarHabitantes.addActionListener(new Controller()); modPoblacion.addActionListener(new Controller()); movPoblacion.addActionListener(new Controller()); menuPoblaciones.add(crearPoblacion); menuPoblaciones.add(borrarPoblacion); menuPoblaciones.add(ordenarNombre); menuPoblaciones.add(ordenarHabitantes); menuPoblaciones.add(modPoblacion); menuPoblaciones.add(movPoblacion); // Creo el menú de ayuda acercaDe.addActionListener(new AcercaDe()); ayuda.add(acercaDe); // Crea el barraDeMenu.add(menuArchivo); barraDeMenu.add(menuProvincias); barraDeMenu.add(menuPoblaciones); barraDeMenu.add(ayuda); return barraDeMenu; } // Sitúo la línea de botones lineaDeBotones. setBackground(new Color(200, 100, 100)); // Boton crear provincia Icon Iprovincia = new ImageIcon(getClass (). getResource("/iconos/provincia.png")); proCrear.addActionListener(new Controller()); // Boton crear poblacion Icon Ipoblacion = new ImageIcon(getClass (). getResource("/iconos/poblacion.png")); poCrear.addActionListener(new Controller()); // Boton actualizar prediccion Icon actualizar = new ImageIcon(getClass (). getResource("/iconos/actualizar.png")); JButton aPrediccion = new JButton("Actualizar Predicción",actualizar ); aPrediccion.setToolTipText("Click para actualizar las predicciones"); aPrediccion.addActionListener(new Controller()); // Añadir los botones a la barra lineaDeBotones.add(proCrear); lineaDeBotones.add(poCrear); lineaDeBotones.add(aPrediccion); return lineaDeBotones; } private JPanel addPanelIzquierda () { // Construccion del arbol tree = new JTree(modelo ); // Construccion de los datos del arbol for(String s : almacen. getProvincias()){ int j = 0; modelo.insertNodeInto(provincia, provinciasPrincipal, j); j++; for(IPoblacion i : almacen.getPoblaciones(s)){ int x = 0; modelo.insertNodeInto(poblacion, provincia, x); x++; } } @Override String selectedNodeName = selectedNode. toString(); if (selectedNode.isLeaf()) { System. out. println(selectedNodeName ); } } }); panel.add(tree); panel. setBackground(Color. WHITE); return panel; } private JPanel addpredicciones () { // Creamos la tabla de las predicciones String columnas [] = {"Fecha", "Temp. Mínima", "Temp. Máxima", "Icono", "Estado del cielo"}; {"Kathy", "Smith", {"John", "Doe", {"Sue", "Black", {"Jane", "White", {"Joe", "Brown", }; //predicciones.add(lPrediccion, BorderLayout.NORTH); predicciones. setBackground(Color. white); return predicciones; } private JPanel addlineaEstado () { // Sitúo la línea de estado lineaDeEstado. setBackground(new Color(0, 80, 80)); ventanaDeeventos. setForeground(new Color(200, 200, 60)); lineaDeEstado.add(ventanaDeeventos); return lineaDeEstado; } private void guardarAntesDeSalir() { // Guardar almacen almacen.guardar(FICHERO); System. out. println("Gracias por utilizar nuestro programa"); } String nombre = e. getActionCommand(); EvaluarAccion(nombre); } public void EvaluarAccion (String accion ) { switch (accion) { case "Guardar": almacen.guardar(FICHERO); JOptionPane. showMessageDialog(null, "El almacen ha sido guardado", "Guardado", DISPOSE_ON_CLOSE ); break; case "Cargar": almacen = RecuperarAlmacenPoblaciones(); break; case "Salir": break; case "Crear provincia": if((crearProvincia != null)&&(!crearProvincia.equals(""))){ almacen.addProvincia(crearProvincia); }else{ JOptionPane. showMessageDialog(null, "Error al crear provincia", "Error", DISPOSE_ON_CLOSE ); } break; case "Borrar provincia": if((borrarProvincia != null)&&(!borrarProvincia.equals(""))){ almacen.delProvincia(borrarProvincia); }else{ JOptionPane. showMessageDialog(null, "Error al borrar provincia", "Error", DISPOSE_ON_CLOSE ); } break; case "Crear poblacion": new VentanaCrearPoblacion(gui,almacen).setVisible(true); break; case "Borrar poblacion": new VentanaBorrarPoblacion(gui,almacen).setVisible(true); break; case "Ordenar por nombre": break; case "Ordenar por habitantes": break; case "Modificar poblacion": break; case "Mover poblacion": break; case "Actualizar Predicción": IPoblacion poblacion = almacen.getPoblacion(listaProvincias.getSelectedItem(), listaPoblaciones.getSelectedItem()); try { listaPredicciones.removeAll(); for(IPrediccion p : gestor.getPredicciones((IPoblacionAEMET) poblacion)){ listaPredicciones.add(p.getFecha() + " : " + p.getEstadoCielo() + " : " + p.getTemperaturaMaxima() + " : " + p.getTemperaturaMinima()); } } catch (GestorAEMETException e) { new Aviso(gui,e.getMessage()); } break; case "Acerca de" : new VentanaAcercaDe(gui); break; } } } String columnas [] = {"Fecha", "Temp. Mínima", "Temp. Máxima", "Icono", "Estado del cielo"}; public boolean cellEditable = false; public java.util.List<IPrediccion> dataArray = null; data = data2; columnas = columnas2; } public int getColumnCount() { return columnas.length; } @Override public int getRowCount() { return data.length; } @Override public Object getValueAt (int arg0, int arg1 ) { return data[arg0][arg1]; } public void setValueAt (Object value, int row, int col ){ data[row][col] = value; fireTableCellUpdated(row,col); } } /** * Clase que implementa la acción del menú "acerca de". */ VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe( InterfazAWT_AEMET.this); ventanaAcercaDe.setVisible(true); } }// Acerca de /** * Método main. * @throws GestorAEMETException */ public static void main (String[] args ) throws GestorAEMETException { InterfazAWT_AEMET mimarco = new InterfazAWT_AEMET("Gestor AEMET", 1000, 500); mimarco.setDefaultCloseOperation(DISPOSE_ON_CLOSE); mimarco.setVisible(true); } // Main }
clase prediccion:package principal; import javax.swing.ImageIcon; import paa.provincias.IPrediccion; public class Prediccion implements IPrediccion { private String temperaturaMaxima ; private String temperaturaMinima ; public Prediccion() { } public String getEstadoCielo () { return estadoCielo; } return fecha; } public String getPoblacion () { return poblacion; } public String getProvincia () { return provincia; } public String getTemperaturaMaxima () { return temperaturaMaxima; } public String getTemperaturaMinima () { return temperaturaMinima; } return fecha + " : " + estadoCielo + " : " + temperaturaMaxima + " : " + temperaturaMinima; } return icono; } }
clase poblacionpackage principal; import java.io.Serializable; import java.util.List; import paa.provincias.IPoblacion; import paa.provincias.IPoblacionAEMET; import paa.provincias.IPrediccion; /** * Clase que modela una poblacion con nombre,numero de habitantes y provicnia * asociada * * @author kikian * */ public class Poblacion implements IPoblacion, Comparable<Poblacion>, /** * */ private static final long serialVersionUID = 1L; private int habitantes; public List<IPrediccion> lista = null; /** * Crea una poblacion con los valores que se le pasan como parametros * * @param nombre * - nombre de la poblacion * @param habitantes * - Numero de habitantes * @param provincia * - provincia a la que pertenece la poblacion */ public Poblacion (String nombre, int habitantes, String provincia, this.nombre = nombre; this.habitantes = habitantes; this.provincia = provincia; this.codigoAEMET = codigoAEMET; } /** * Crea una poblacion a partir del codigo AEMET * * @param codigoAEMET */ public Poblacion (String codigoAEMET ) { this.codigoAEMET = codigoAEMET; } /** * Devuelve el número de habitantes de la población */ public int getHabitantes() { return habitantes; } /** * Devuelve el nombre de la población */ return nombre; } /** * Devuelve la provincia a la que pertenece la población */ public String getProvincia () { return provincia; } /** * Actualiza el número de habitantes de la población * * @param habitantes * - habitantes que tiene la poblacion */ public void setHabitantes(int habitantes) { this.habitantes = habitantes; } /** * Actualiza el nombre de la población * * @param nombre * -nombre que tendra la poblacion */ public void setNombre (String nombre ) { this.nombre = nombre; } /** * Actualiza la provincia a la que pertenece la población * * @param provincia * - Provincia a la que cambiaremos la poblacion */ public void setProvincia (String provincia ) { this.provincia = provincia; } /** * Devuelve un string con la informacion de la poblacion */ return this.nombre + "," + this.habitantes + "," + this.provincia; } /** * Metodo para comparar las poblaciones y ordenarlas por defecto por el * nombre de la poblacion * * @param arg0 * - poblacion que vamos a comparar */ public int compareTo(Poblacion arg0) { int res = 0; if (arg0 == null) { } else { res = this.nombre.compareTo(arg0.nombre); return res; } } @Override public String getCodigoAEMET () { return codigoAEMET; } public void setPrediccion(List<IPrediccion> lista){ this.lista = lista; } public List<IPrediccion> getPrediccion(){ return lista; } }
clase almacenpoblacionespackage principal; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import paa.provincias.IAlmacenPoblaciones; import paa.provincias.IPoblacion; import paa.provincias.IPoblacionAEMET; /** * Clase que modela un almacen de poblaciones * * @author kikian * */ public class AlmacenPoblaciones implements IAlmacenPoblaciones, Serializable, IPoblacionAEMET { /** * */ private static final long serialVersionUID = 1L; private Map<String, SortedSet<IPoblacion>> Aprovincias; /** * Ordenación principal en orden alfabético por el campo nombre de la * población. */ final static int ORDENARPORNOMBRE = 2; /** * Ordenación principal por el número de habitantes en sentido ascendente, * en segundo lugar, en caso de igualdad, por el orden alfabético del campo * nombre. */ final static int ORDENARPORHABITANTES = 3; /** * Constructor de la clase AlmacenPoblaciones */ public AlmacenPoblaciones() { Aprovincias = new HashMap<String, SortedSet<IPoblacion>>(); } /** * Añade una población a la provincia correspondiente si la población no * existe ya en ella, o sea, no hay ya otra población con el mismo nombre. * Las poblaciones se almacenarán ordenadas según el criterio de ordenación * definido. * * @param provincia * - Provincia en la que se añadira la poblacion * @param poblacion * - Poblacion a añadir */ public boolean addPoblacion (String provincia, IPoblacion poblacion ) { boolean res = false; if (provincia == null || poblacion == null || !Aprovincias.containsKey(provincia)) { res = false; System. out. println("La Provincia no existe, creela antes de añadir poblacion"); } else { SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia); sPoblacion.add(poblacion); Aprovincias.put(provincia, sPoblacion); res = true; } return res; } /** * Añade una nuevo provincia al almacén de poblaciones si no está ya * presente en el almacén. Si ya había una del mismo nombre no se realiza * ningún cambio en el almacén y la llamada devuelve false. * * @param provincia * - La provincia que queremos añadir */ public boolean addProvincia (String provincia ) { boolean res = false; if (Aprovincias.containsKey(provincia)) { System. out. println("Ya existe la provincia"); } else { Aprovincias.put(provincia, new TreeSet<IPoblacion>()); res = true; } return res; } /** * Indica si ya existe en la provincia una población con ese nombre. * * @param provincia * - Nombre de la provincia en la que vamos a buscar * @param poblacion * - Nombre de la poblacion que queremos buscar */ public boolean containsPoblacion (String provincia, String poblacion ) { boolean res = false; if (provincia == null || !Aprovincias.containsKey(provincia)) { .println("La provincia no existe, creela antes de eliminar poblacion"); } else { SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia); for (IPoblacion p : sPoblacion) { if (p.getNombre() == poblacion) { res = true; } } } return res; } /** * Indica si ya existe en la provincia una población. * * @param provincia * - La provincia en la que buscaremos * @param poblacion * - La poblacion que queremos buscar */ public boolean containsPoblacion (String provincia, IPoblacion poblacion ) { boolean res = false; if (provincia == null || !Aprovincias.containsKey(provincia)) { .println("La provincia no existe, creela antes de eliminar poblacion"); } else { SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia); if (sPoblacion.contains(poblacion)) { res = true; } } return res; } /** * Indica si ya existe en el almacén la provincia correspondiente. * * @param provincia * - La provincia que queremos comprobar */ public boolean containsProvincia (String provincia ) { boolean res = false; if (Aprovincias.containsKey(provincia)) { res = true; System. out. println("La provincia esta en el almacen"); } else { System. out. println("La provincia no esta en el almacen"); } return res; } /** * Borra la población situada en la posición correspondiente dentro de la * provincia. La posición es un entero entre 1 y el número de poblaciones * que contiene la provincia. La posición de una población es variable, * puesto que cambia si se borran poblaciones de la provincia o se reordena. * * @param provincia * - Provincia en la que buscaremos la poblacion * @param posicion * - posicion de la poblacion que sera borrada */ public boolean delPoblacion (String provincia, int posicion ) { if (!Aprovincias.containsKey(provincia)) { System. out. println("No existe la provincia"); return false; } else { SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia); Iterator<IPoblacion> ite = sPoblacion.iterator(); int contador = 1; while (ite.hasNext() && contador < posicion) { ite.next(); contador++; } if (ite.hasNext() && contador == posicion) { ite.next(); ite.remove(); Aprovincias.put(provincia, sPoblacion); return true; } } return false; } /** * Borra de la provincia la población que se pasa como parámetro. * * @param provincia * - La provincia donde buscaremos * @param poblacion * - La poblacion que se eliminara */ public boolean delPoblacion (String provincia, IPoblacion poblacion ) { boolean res = false; if (!Aprovincias.containsKey(provincia)) { System. out. print("La provincia no existe"); } else { SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia); sPoblacion.remove(poblacion); Aprovincias.put(provincia, sPoblacion); } return res; } /** * Borra de la provincia la población cuyo nombre se pasa como parámetro. * * @param provincia * - La provincia de donde eliminaremos la poblacion * @param poblacion * - El nombre de la poblacion */ public boolean delPoblacion (String provincia, String poblacion ) { if (!Aprovincias.containsKey(provincia)) { System. out. print("La provincia no existe"); return false; } else { SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia); for (IPoblacion s : sPoblacion) { if (s.getNombre().equals(poblacion)) { sPoblacion.remove(s); return true; } } return false; } } /** * Borra un provincia del almacén de poblaciones si está presente en el * almacén. Si no hay una del mismo nombre no se realiza ningún cambio en el * almacén y la llamada devuelve false. * * @param provincia * - La provincia que queremos eliminar */ public boolean delProvincia (String provincia ) { if (Aprovincias.containsKey(provincia)) { Aprovincias.remove(provincia); return true; } else { System. out. println("La provincia no esta en el almacen"); return false; } } /** * Devuelve el número de poblaciones que contiene la provincia cuyo nombre * se indica. * * @param provincia * - La provincia de la que obtendremos el numero de poblaciones */ public int getNumPoblaciones (String provincia ) { SortedSet<IPoblacion> spoblacion = Aprovincias.get(provincia); return spoblacion.size(); } /** * Devuelve la población situada en la posición correspondiente dentro de la * provincia. La posición es un entero entre 1 y el número de poblaciones * que contiene la provincia. La posición de una población es variable, * puesto que cambia si se borran poblaciones de la provincia o se * reordenan. * * @param provincia * - la provincia en la que se buscara * @param posicion * - la posicion que se eliminara */ public IPoblacion getPoblacion (String provincia, int posicion ) { IPoblacion pBuscada = null; if (!Aprovincias.containsKey(provincia)) { System. out. println("No existe la provincia"); } else { SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia); Iterator<IPoblacion> ite = sPoblacion.iterator(); int contador = 1; while (ite.hasNext() && contador < posicion) { ite.next(); contador++; } if (ite.hasNext() && contador == posicion) { pBuscada = ite.next(); ite.remove(); } } return pBuscada; } /** * Devuelve de la provincia la población que posee el nombre que se pasa * como parámetro. * */ public IPoblacion getPoblacion (String provincia, String poblacion ) { SortedSet<IPoblacion> spoblacion = Aprovincias.get(provincia); IPoblacion p = null; for (IPoblacion s : spoblacion) { if (s.getNombre().equals(poblacion)) { p = s; } } return p; } /** * Devuelve todas las poblaciones de la provincia correspondiente ordenadas * según el criterio actual. * * @param provincia * - La provincia de la que obtendremos el Set con las * poblaciones */ public SortedSet <IPoblacion > getPoblaciones (String provincia ) { SortedSet<IPoblacion> spoblacion = null; if (!Aprovincias.containsKey(provincia)) { System. out. println("No existe la provincia"); } else { spoblacion = Aprovincias.get(provincia); } return spoblacion; } /** * Devuelve un conjunto con los nombres de los provincias que existen en el * almacén de poblaciones. */ public Set<String> getProvincias() { Set<String> provincias = Aprovincias.keySet(); return provincias; } /** * Guarda el almacén de poblaciones en el fichero cuyo nombre se pasa como * parámetro. Devuelve true si se ha guardado correctamente y false si hay * algún tipo de error o excepción. * * @param escritura * - nombre del fichero */ public boolean guardar (String escritura ) { try { salida.writeObject(Aprovincias); e.printStackTrace(); } finally { if (salida != null) try { salida.close(); System. out. println("Guardado"); return true; e.printStackTrace(); } } return false; } /** * Permite cambiar el criterio de ordenación de la correspondiente * provincia, las poblaciones almacenadas serán reordenadas según el nuevo * criterio de ordenación que se indica como parámetro utilizando las * constantes predefinidas: ORDENARPORNOMBRE ú ORDENARPORHABITANTES (ver su * descripción en fields). * * @param provincia * - Provincia en la que se reordenaran las poblaciones * @param ordenarPor * - Metodo para ordenar las poblaciones */ public boolean ordenarPor (String provincia, int ordenarPor ) { if (provincia != null || ordenarPor != ORDENARPORNOMBRE || ordenarPor != ORDENARPORHABITANTES) { if (ordenarPor == ORDENARPORNOMBRE) { // Metemos en un Set las poblaciones de la provincia asociada Set<IPoblacion> spoblacion = Aprovincias.get(provincia); // Creamos un nuevo Set de tipo TreeSet y le aplicamos el // criterio de ordenacion // de la clase porNombre, luego le añadimos todas las // poblaciones para que se ordenen TreeSet<IPoblacion> n1Poblacion = new TreeSet<IPoblacion>( new porNombre()); n1Poblacion.addAll(spoblacion); Aprovincias.put(provincia, n1Poblacion); } else if (ordenarPor == ORDENARPORHABITANTES) { // Mismo procedimiento que ORDENARPORNOMBRE pero ahora // utilizamos el criterio de ordenacion // de la clase CompareHabitantes Set<IPoblacion> spoblacion = Aprovincias.get(provincia); TreeSet<IPoblacion> n2Poblacion = new TreeSet<IPoblacion>( new CompareHabitantes()); n2Poblacion.addAll(spoblacion); Aprovincias.put(provincia, n2Poblacion); } return true; } return false; } /** * Recupera un almacén de poblaciones del fichero cuyo nombre se pasa como * parámetro. Si el fichero no existe o hay algún tipo de excepción devuelve * false y crea un almacén vacío. Si lo recupera, devuelve true. * * @param lectura * - Nombre del archivo que leeremos */ @SuppressWarnings("unchecked") public boolean recuperar (String lectura ) { try { Aprovincias = (Map<String, SortedSet<IPoblacion>>) entrada .readObject(); e.printStackTrace(); } finally { if (entrada != null) try { entrada.close(); return true; e.printStackTrace(); } } return false; } /** * Clase para comparar las poblaciones por nombre * * @author kikian * */ class porNombre implements Comparator<IPoblacion> { @Override public int compare(IPoblacion o1, IPoblacion o2) { return o1.getNombre().compareTo(o2.getNombre()); } } /** * Obtiene el codigo AEMET asociado a la poblacion */ public String getCodigoAEMET () { // TODO Auto-generated method stub return null; } }
las demas clases son las correspondientes a las ventanas auxiliares y estan correctamente, a ver si alguno me podeis hechar una mano, muchas gracias
|
|
|
En línea
|
|
|
|
kikian94
Desconectado
Mensajes: 66
|
Tengo problemas para actualizar el jtree no se como hacerlo, utilizo reload pero no se actualiza, las provincias y poblaciones se guardan pero el jtree ni se inmuta, y otra cosa en la tabla, como actualizo los datos?, por que el metodo para actualizarlos que es setValueAt esta inplementado dentro del tablemodel, no dentro de la tabla, principal: package principal; import java.awt.*; import java.awt.event.*; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.SwingConstants; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreeSelectionModel; import Poblacion.VentanaBorrarPoblacion; import Poblacion.VentanaCrearPoblacion; import paa.provincias.GestorAEMET; import paa.provincias.GestorAEMETException; import paa.provincias.IPoblacion; import paa.provincias.IPrediccion; /** * Fichero: InterfazAWT_AEMET.java Clase que implementa la Interfaz Gráfica * AEMET con awt. * * @author PAA * @version 1.0 */ public class InterfazAWT_AEMET extends JFrame { /** * */ private static final long serialVersionUID = 502635761186556414L; private static final String FICHERO = "almacen.dat"; private AlmacenPoblaciones almacen; // private IAlmacenPoblaciones almacenPoblaciones; private java.util.List<IPrediccion> listaPredicciones; private InterfazAWT_AEMET gui; private GestorAEMET gestor = new GestorAEMET(); private String nombrePoblacion ; /** * Constructor. * * @throws GestorAEMETException */ public InterfazAWT_AEMET (String titulo, int ancho, int alto ) { super(titulo); setSize(ancho, alto); setLocationRelativeTo(null); setLayout (new BorderLayout()); // Layout de la aplicación, podría ser otro almacen = RecuperarAlmacenPoblaciones(); initComponents(); JFrame. setDefaultLookAndFeelDecorated(true); } public AlmacenPoblaciones RecuperarAlmacenPoblaciones() { // Recuperamos el almacén AlmacenPoblaciones almacenPoblaciones1 = new AlmacenPoblaciones(); if (almacenPoblaciones1.recuperar(FICHERO)){ Icon icono = new ImageIcon(getClass (). getResource("/iconos/check.png")); JOptionPane. showMessageDialog(null, "Recuperado el almacen del fichero " + FICHERO, "Recuperado", JOptionPane. INFORMATION_MESSAGE,icono ); }else{ JOptionPane. showMessageDialog(null, "No se ha podido recuperar el almacen del fichero" + FICHERO, "Error", JOptionPane. ERROR_MESSAGE); }return almacenPoblaciones1; } public void initComponents() { // Boton salir por defecto this. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); setJMenuBar(addJMenuBar()); //Creamos el splitpanel y lo colocamos en medio del jtree y la tabla, despues lo añadimos al Jframe splitPane.setOneTouchExpandable(true); splitPane.setDividerLocation(100); splitPane.setDividerSize(10); } // Sitúo los menús desplegables // Creo el menú Archivo crearCargar.addActionListener(new Controller()); crearGuardar.addActionListener(new Controller()); salir.addActionListener(new Controller()); menuArchivo.add(crearCargar); menuArchivo.add(crearGuardar); menuArchivo.add(salir); // Creo el menú Provincias crearProvincias.addActionListener(new Controller()); borrarProvincias.addActionListener(new Controller()); menuProvincias.add(crearProvincias); menuProvincias.add(borrarProvincias); // Creo el menu Poblaciones crearPoblacion.addActionListener(new Controller()); borrarPoblacion.addActionListener(new Controller()); ordenarNombre.addActionListener(new Controller()); ordenarHabitantes.addActionListener(new Controller()); modPoblacion.addActionListener(new Controller()); movPoblacion.addActionListener(new Controller()); menuPoblaciones.add(crearPoblacion); menuPoblaciones.add(borrarPoblacion); menuPoblaciones.add(ordenarNombre); menuPoblaciones.add(ordenarHabitantes); menuPoblaciones.add(modPoblacion); menuPoblaciones.add(movPoblacion); // Creo el menú de ayuda acercaDe.addActionListener(new AcercaDe()); ayuda.add(acercaDe); // Crea el barraDeMenu.add(menuArchivo); barraDeMenu.add(menuProvincias); barraDeMenu.add(menuPoblaciones); barraDeMenu.add(ayuda); return barraDeMenu; } // Sitúo la línea de botones lineaDeBotones. setBackground(new Color(200, 100, 100)); // Boton crear provincia Icon Iprovincia = new ImageIcon(getClass (). getResource("/iconos/provincia.png")); proCrear.addActionListener(new Controller()); // Boton crear poblacion Icon Ipoblacion = new ImageIcon(getClass (). getResource("/iconos/poblacion.png")); poCrear.addActionListener(new Controller()); // Boton actualizar prediccion Icon actualizar = new ImageIcon(getClass (). getResource("/iconos/actualizar.png")); JButton aPrediccion = new JButton("Actualizar Predicción",actualizar ); aPrediccion.setToolTipText("Click para actualizar las predicciones"); aPrediccion.addActionListener(new Controller()); // Añadir los botones a la barra lineaDeBotones.add(proCrear); lineaDeBotones.add(poCrear); lineaDeBotones.add(aPrediccion); return lineaDeBotones; } private JTree addPanelIzquierda () { // Construccion de los datos del arbol y del arbol CrearArbol(); //Creamos el listener del JTree @Override treeDatos = (JTree) se. getSource(); nombrePoblacion = selectedNode.toString(); if (selectedNode.isLeaf()) { System. out. println(nombrePoblacion ); System. out. println(selectedNode. getParent(). toString()); } } }); return tree; } public void CrearArbol(){ tree = new JTree(modelo ); for(String s : almacen. getProvincias()){ int j = 0; modelo.insertNodeInto(provincia, provinciasPrincipal, j); j++; for(IPoblacion i : almacen.getPoblaciones(s)){ int x = 0; modelo.insertNodeInto(poblacion, provincia, x); x++; } } } private JPanel addpredicciones () { // Creamos la tabla de las predicciones //predicciones.add(lPrediccion, BorderLayout.NORTH); predicciones. setBackground(Color. white); return predicciones; } private JPanel addlineaEstado () { // Sitúo la línea de estado lineaDeEstado. setBackground(new Color(0, 80, 80)); ventanaDeeventos. setForeground(new Color(200, 200, 60)); lineaDeEstado.add(ventanaDeeventos); return lineaDeEstado; } private void guardarAntesDeSalir() { // Guardar almacen almacen.guardar(FICHERO); System. out. println("Gracias por utilizar nuestro programa"); } @Override String nombre = e. getActionCommand(); EvaluarAccion(nombre); } public void EvaluarAccion (String accion ) { switch (accion) { case "Guardar": almacen.guardar(FICHERO); JOptionPane. showMessageDialog(null, "El almacen ha sido guardado", "Guardado", DISPOSE_ON_CLOSE ); break; case "Cargar": almacen = RecuperarAlmacenPoblaciones(); break; case "Salir": break; case "Crear provincia": if((crearProvincia != null)&&(!crearProvincia.equals(""))){ almacen.addProvincia(crearProvincia); CrearArbol(); modelo.reload(); }else{ JOptionPane. showMessageDialog(null, "Error al crear provincia", "Error", DISPOSE_ON_CLOSE ); } break; case "Borrar provincia": if((borrarProvincia != null)&&(!borrarProvincia.equals(""))){ almacen.delProvincia(borrarProvincia); CrearArbol(); }else{ JOptionPane. showMessageDialog(null, "Error al borrar provincia", "Error", DISPOSE_ON_CLOSE ); } break; case "Crear poblacion": new VentanaCrearPoblacion(gui,almacen).setVisible(true); CrearArbol(); break; case "Borrar poblacion": new VentanaBorrarPoblacion(gui,almacen).setVisible(true); CrearArbol(); break; case "Ordenar por nombre": break; case "Ordenar por habitantes": break; case "Modificar poblacion": break; case "Mover poblacion": break; case "Actualizar Predicción": try { Poblacion poblacion = (Poblacion) almacen.getPoblacion(selectedNode.getParent().toString(), nombrePoblacion); System. out. println(poblacion. getCodigoAEMET()); if(poblacion.getPrediccion()==null){ listaPredicciones = gestor.getPredicciones( poblacion ); poblacion.lista = listaPredicciones; }else{ } JOptionPane. showMessageDialog(null, gae, "Error", DISPOSE_ON_CLOSE ); } break; case "Acerca de" : new VentanaAcercaDe(gui); break; } } } /** * Clase que implementa la acción del menú "acerca de". */ @Override VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe( InterfazAWT_AEMET.this); ventanaAcercaDe.setVisible(true); } }// Acerca de /** * Método main. * @throws GestorAEMETException */ public static void main (String[] args ) throws GestorAEMETException { InterfazAWT_AEMET mimarco = new InterfazAWT_AEMET("Gestor AEMET", 1000, 500); mimarco.setDefaultCloseOperation(DISPOSE_ON_CLOSE); mimarco.setVisible(true); } // Main }
tablemodel: package principal; import java.util.Iterator; import javax.swing.table.AbstractTableModel; import paa.provincias.IPrediccion; /** * */ private static final long serialVersionUID = 1L; String columnas [] = {"Fecha", "Temp. Mínima", "Temp. Máxima", "Icono", "Estado del cielo"}; public java.util.List<IPrediccion> predicciones; for(int i = 0; i < 7; i++ ){ for(int j = 0; j < 5;j++){ } } } @Override public int getColumnCount() { return columnas.length; } @Override public int getRowCount() { return data.length; } @Override public Object getValueAt (int row, int col ) { return data[row][col]; } @Override public String getColumnName (int col ){ return columnas[col]; } @Override public Class getColumnClass(int c){ return getValueAt(0,c).getClass(); } //public boolean isCellEditable(int row,int col){} @Override public void setValueAt (Object value, int row, int col ){ data[row][col] = value; fireTableCellUpdated(row,col); } private void printDebugData() { int numRows = getRowCount(); int numCols = getColumnCount(); for (int i = 0; i < numRows; i++) { System. out. print(" row " + i + ":"); for (int j = 0; j < numCols; j++) { System. out. print(" " + data [i ][j ]); } } System. out. println("--------------------------"); } public void rellenar(java.util.List<IPrediccion> prediccion){ Iterator<IPrediccion> it; it = prediccion.iterator(); int i = 0; int j; while (it.hasNext()){ //Recorremos la lista y colocamos en las celdas de cada fila los datos de las predicciones IPrediccion pre = it.next(); j=0; setValueAt(pre.getFecha(), i, j); j++; setValueAt(pre.getTemperaturaMinima(), i, j); j++; setValueAt(pre.getTemperaturaMaxima(), i, j); j++; setValueAt(pre.getIconoEstadoCielo(), i, j); j++; setValueAt(pre.getEstadoCielo(), i, j); j++; i++; } } }
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
mostrar datos en tiempo real
PHP
|
PepiX
|
2
|
2,747
|
6 Diciembre 2006, 13:55 pm
por PepiX
|
|
|
Llega el temido día: la aplicación móvil de Gmail empezará a mostrar anuncios
Noticias
|
wolfbcn
|
0
|
1,745
|
29 Septiembre 2013, 18:08 pm
por wolfbcn
|
|
|
La aplicación Google Now ya no necesita Internet para mostrar la agenda de ...
Noticias
|
wolfbcn
|
0
|
1,203
|
4 Mayo 2014, 21:38 pm
por wolfbcn
|
|
|
Mostrar formularios de una pagina web en java Swing
Java
|
soy_nicanor
|
0
|
1,561
|
30 Enero 2016, 20:23 pm
por soy_nicanor
|
|
|
El BOE publica el Plan para que las zonas rurales y poblaciones de menos de ...
Noticias
|
wolfbcn
|
1
|
3,131
|
8 Noviembre 2018, 18:33 pm
por El_Andaluz
|
|