Aplicacion en swing para mostrar el tiempo de provincias y poblaciones

Iniciado por kikian94, 12 Abril 2015, 16:05 PM

0 Miembros y 1 Visitante están viendo este tema.

kikian94

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:
Código (java) [Seleccionar]
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());
this.add(addJToolBar(), BorderLayout.NORTH);
this.add(addlineaEstado(), BorderLayout.SOUTH);
this.add(addPanelIzquierda(), BorderLayout.WEST);
  //Create a split pane with the two scroll panes in it.
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,addPanelIzquierda(),addpredicciones());
    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));*/
this.add(addpredicciones(), BorderLayout.CENTER);
}

private JMenuBar addJMenuBar() {
// Sitúo los menús desplegables
JMenuBar barraDeMenu = new JMenuBar();

// Creo el menú Archivo
JMenu menuArchivo = new JMenu("Archivo");
JMenuItem crearGuardar = new JMenuItem("Guardar");
JMenuItem crearCargar = new JMenuItem("Cargar");
JMenuItem salir = new JMenuItem("Salir");
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
JMenu menuProvincias = new JMenu("Provincias");
JMenuItem crearProvincias = new JMenuItem("Crear provincia");
JMenuItem borrarProvincias = new JMenuItem("Borrar provincia");
crearProvincias.addActionListener(new Controller());
borrarProvincias.addActionListener(new Controller());
menuProvincias.add(crearProvincias);
menuProvincias.add(borrarProvincias);

// Creo el menu Poblaciones
JMenu menuPoblaciones = new JMenu("Poblaciones");
JMenuItem crearPoblacion = new JMenuItem("Crear poblacion");
JMenuItem borrarPoblacion = new JMenuItem("Borrar poblacion");
JMenuItem ordenarNombre = new JMenuItem("Ordenar por nombre");
JMenuItem ordenarHabitantes = new JMenuItem("Ordenar por habitantes");
JMenuItem modPoblacion = new JMenuItem("Modificar poblacion");
JMenuItem movPoblacion = new JMenuItem("Mover poblacion");
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
JMenu ayuda = new JMenu("Ayuda");
JMenuItem acercaDe = new JMenuItem("Acerca de");
acercaDe.addActionListener(new AcercaDe());
ayuda.add(acercaDe);

// Crea el
barraDeMenu.add(menuArchivo);
barraDeMenu.add(menuProvincias);
barraDeMenu.add(menuPoblaciones);
barraDeMenu.add(ayuda);
return barraDeMenu;
}

private JToolBar addJToolBar() {
// Sitúo la línea de botones
JToolBar lineaDeBotones = new JToolBar();
lineaDeBotones.setBackground(new Color(200,100,100));

// Boton crear provincia
Icon Iprovincia= new ImageIcon(getClass().getResource("/iconos/provincia.png"));
JButton proCrear = new JButton("Crear provincia",Iprovincia);
proCrear.addActionListener(new Controller());

// Boton crear poblacion
Icon Ipoblacion= new ImageIcon(getClass().getResource("/iconos/poblacion.png"));
JButton poCrear = new JButton("Crear poblacion",Ipoblacion);
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
        DefaultMutableTreeNode provinciasPrincipal = new DefaultMutableTreeNode("Provincias");
        DefaultTreeModel modelo = new DefaultTreeModel(provinciasPrincipal);
        JTree tree = new JTree(modelo);

        // Construccion de los datos del arbol
       
        for(String s : almacen.getProvincias()){
        int j = 0;
        DefaultMutableTreeNode provincia = new DefaultMutableTreeNode(s);
        modelo.insertNodeInto(provincia, provinciasPrincipal, j);
        j++;
        for(IPoblacion i : almacen.getPoblaciones(s)){
        int x = 0;
        DefaultMutableTreeNode poblacion = new DefaultMutableTreeNode(i.getNombre());
        modelo.insertNodeInto(poblacion, provincia, x);
        x++;
        }
        }
return tree;
}

private JPanel addpredicciones() {
// Creamos el panel de las predicciones
JPanel predicciones = new JPanel(new BorderLayout());
JLabel lPrediccion = new JLabel("Predicciones de :");
predicciones.add(lPrediccion, BorderLayout.NORTH);
predicciones.add(listaPredicciones, BorderLayout.CENTER);
return predicciones;
}

private JPanel addlineaEstado() {
// Sitúo la línea de estado
JPanel lineaDeEstado = new JPanel();
lineaDeEstado.setLayout(new FlowLayout(FlowLayout.LEFT));
lineaDeEstado.setBackground(new Color(0,80,80));
JLabel ventanaDeeventos = new JLabel("Gestor AEMET v2.0 (PAA)",SwingConstants.CENTER);
ventanaDeeventos.setForeground(new Color(200,200,60));
ventanaDeeventos.setHorizontalAlignment(SwingConstants.CENTER);
ventanaDeeventos.setVerticalAlignment(SwingConstants.CENTER);
lineaDeEstado.add(ventanaDeeventos);
return lineaDeEstado;
}

private void guardarAntesDeSalir() {

// Guardar almacen
almacen.guardar(FICHERO);
System.out.println("Gracias por utilizar nuestro programa");
}

class Controller implements ActionListener {

public void actionPerformed(ActionEvent e) {
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":
System.exit(0);
break;
case "Crear provincia":
String crearProvincia = JOptionPane.showInputDialog(null,"Provincia:","Nueva provincia",JOptionPane.QUESTION_MESSAGE);
if((crearProvincia != null)&&(!crearProvincia.equals(""))){
almacen.addProvincia(crearProvincia);
}else{
JOptionPane.showMessageDialog(null, "Error al crear provincia", "Error", DISPOSE_ON_CLOSE);
}

break;
case "Borrar provincia":
String borrarProvincia = JOptionPane.showInputDialog(null,"Provincia:","Eliminar provincia",JOptionPane.QUESTION_MESSAGE);
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".
*/
class AcercaDe implements ActionListener { // Clase interna
public void actionPerformed(ActionEvent e) {
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:
Código (java) [Seleccionar]
String borrarProvincia = JOptionPane.showInputDialog(null,"Provincia:","Eliminar provincia",JOptionPane.QUESTION_MESSAGE);
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

kikian94

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:
Código (java) [Seleccionar]
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();
private JTree tree;
private JPanel panel;
private JTable tabla;
/**
* 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());
this.add(addJToolBar(), BorderLayout.NORTH);
this.add(addlineaEstado(), BorderLayout.SOUTH);
  //Creamos el splitpanel y lo colocamos en medio del jtree y la tabla, despues lo añadimos al Jframe
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,addPanelIzquierda(),addpredicciones());
    splitPane.setOneTouchExpandable(true);
    splitPane.setDividerLocation(100);
    splitPane.setDividerSize(10);
    this.add(splitPane,BorderLayout.CENTER);
}

private JMenuBar addJMenuBar() {
// Sitúo los menús desplegables
JMenuBar barraDeMenu = new JMenuBar();
// Creo el menú Archivo
JMenu menuArchivo = new JMenu("Archivo");
JMenuItem crearGuardar = new JMenuItem("Guardar");
JMenuItem crearCargar = new JMenuItem("Cargar");
JMenuItem salir = new JMenuItem("Salir");
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
JMenu menuProvincias = new JMenu("Provincias");
JMenuItem crearProvincias = new JMenuItem("Crear provincia");
JMenuItem borrarProvincias = new JMenuItem("Borrar provincia");
crearProvincias.addActionListener(new Controller());
borrarProvincias.addActionListener(new Controller());
menuProvincias.add(crearProvincias);
menuProvincias.add(borrarProvincias);

// Creo el menu Poblaciones
JMenu menuPoblaciones = new JMenu("Poblaciones");
JMenuItem crearPoblacion = new JMenuItem("Crear poblacion");
JMenuItem borrarPoblacion = new JMenuItem("Borrar poblacion");
JMenuItem ordenarNombre = new JMenuItem("Ordenar por nombre");
JMenuItem ordenarHabitantes = new JMenuItem("Ordenar por habitantes");
JMenuItem modPoblacion = new JMenuItem("Modificar poblacion");
JMenuItem movPoblacion = new JMenuItem("Mover poblacion");
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
JMenu ayuda = new JMenu("Ayuda");
JMenuItem acercaDe = new JMenuItem("Acerca de");
acercaDe.addActionListener(new AcercaDe());
ayuda.add(acercaDe);

// Crea el
barraDeMenu.add(menuArchivo);
barraDeMenu.add(menuProvincias);
barraDeMenu.add(menuPoblaciones);
barraDeMenu.add(ayuda);
return barraDeMenu;
}

private JToolBar addJToolBar() {
// Sitúo la línea de botones
JToolBar lineaDeBotones = new JToolBar();
lineaDeBotones.setBackground(new Color(200,100,100));

// Boton crear provincia
Icon Iprovincia= new ImageIcon(getClass().getResource("/iconos/provincia.png"));
JButton proCrear = new JButton("Crear provincia",Iprovincia);
proCrear.addActionListener(new Controller());

// Boton crear poblacion
Icon Ipoblacion= new ImageIcon(getClass().getResource("/iconos/poblacion.png"));
JButton poCrear = new JButton("Crear poblacion",Ipoblacion);
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
        DefaultMutableTreeNode provinciasPrincipal = new DefaultMutableTreeNode("Provincias");
        DefaultTreeModel modelo = new DefaultTreeModel(provinciasPrincipal);
        tree = new JTree(modelo);
        panel = new JPanel();
        // Construccion de los datos del arbol
       
        for(String s : almacen.getProvincias()){
        int j = 0;
        DefaultMutableTreeNode provincia = new DefaultMutableTreeNode(s);
        modelo.insertNodeInto(provincia, provinciasPrincipal, j);
        j++;
        for(IPoblacion i : almacen.getPoblaciones(s)){
        int x = 0;
        DefaultMutableTreeNode poblacion = new DefaultMutableTreeNode(i.getNombre());
        modelo.insertNodeInto(poblacion, provincia, x);
        x++;
        }
        }
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree.addTreeSelectionListener(new TreeSelectionListener(){
@Override
public void valueChanged(TreeSelectionEvent se) {
JTree tree = (JTree) se.getSource();
    DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
    String selectedNodeName = selectedNode.toString();
    if (selectedNode.isLeaf()) {
      System.out.println(selectedNodeName);
    }
}
        });
        panel.setBorder(BorderFactory.createLineBorder(Color.blue));
        panel.add(tree);
       
        panel.setBackground(Color.WHITE);
return panel;
}

private JPanel addpredicciones() {
// Creamos la tabla de las predicciones
JPanel predicciones = new JPanel(new BorderLayout());
String columnas[] = {"Fecha", "Temp. Mínima", "Temp. Máxima", "Icono","Estado del cielo"};
Object[][] data = {
    {"Kathy", "Smith",
        "Snowboarding", new Integer(5), new Boolean(false)},
       {"John", "Doe",
        "Rowing", new Integer(3), new Boolean(true)},
       {"Sue", "Black",
        "Knitting", new Integer(2), new Boolean(false)},
       {"Jane", "White",
        "Speed reading", new Integer(20), new Boolean(true)},
       {"Joe", "Brown",
        "Pool", new Integer(10), new Boolean(false)}
   };


TableModel d = new TableModel(data,columnas);
tabla = new JTable(d);
JLabel lPrediccion = new JLabel("Predicciones de :");
//predicciones.add(lPrediccion, BorderLayout.NORTH);
predicciones.add(lPrediccion,BorderLayout.NORTH);
predicciones.add(tabla,BorderLayout.CENTER);
predicciones.setBackground(Color.white);
predicciones.setBorder(BorderFactory.createLineBorder(Color.blue));
return predicciones;
}

private JPanel addlineaEstado() {
// Sitúo la línea de estado
JPanel lineaDeEstado = new JPanel();
lineaDeEstado.setLayout(new FlowLayout(FlowLayout.LEFT));
lineaDeEstado.setBackground(new Color(0,80,80));
JLabel ventanaDeeventos = new JLabel("Gestor AEMET v2.0 (PAA)",SwingConstants.CENTER);
ventanaDeeventos.setForeground(new Color(200,200,60));
ventanaDeeventos.setHorizontalAlignment(SwingConstants.CENTER);
ventanaDeeventos.setVerticalAlignment(SwingConstants.CENTER);
lineaDeEstado.add(ventanaDeeventos);
return lineaDeEstado;
}

private void guardarAntesDeSalir() {

// Guardar almacen
almacen.guardar(FICHERO);
System.out.println("Gracias por utilizar nuestro programa");
}

class Controller implements ActionListener {
public void actionPerformed(ActionEvent e) {
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":
System.exit(0);
break;
case "Crear provincia":
String crearProvincia = JOptionPane.showInputDialog(null,"Provincia:","Nueva provincia",JOptionPane.QUESTION_MESSAGE);
if((crearProvincia != null)&&(!crearProvincia.equals(""))){
almacen.addProvincia(crearProvincia);
}else{
JOptionPane.showMessageDialog(null, "Error al crear provincia", "Error", DISPOSE_ON_CLOSE);
}
break;
case "Borrar provincia":
String borrarProvincia = JOptionPane.showInputDialog(null,"Provincia:","Eliminar provincia",JOptionPane.QUESTION_MESSAGE);
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;
}
}
}




class TableModel extends AbstractTableModel{

String columnas[] = {"Fecha", "Temp. Mínima", "Temp. Máxima", "Icono","Estado del cielo"};
Object[][] data;
public boolean cellEditable = false;
public java.util.List<IPrediccion> dataArray = null;

public TableModel(Object[][] data2, String[] columnas2) {
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".
*/
class AcercaDe implements ActionListener { // Clase interna
public void actionPerformed(ActionEvent e) {
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:

Código (java) [Seleccionar]
package principal;
import javax.swing.ImageIcon;

import paa.provincias.IPrediccion;

public class Prediccion implements IPrediccion {

private String estadoCielo;
private String fecha;
private String poblacion;
private String provincia;
private String temperaturaMaxima;
private String temperaturaMinima;
private ImageIcon icono;

public Prediccion() {

}

public String getEstadoCielo() {
return estadoCielo;
}

public String getFecha() {
return fecha;
}

public String getPoblacion() {
return poblacion;
}

public String getProvincia() {
return provincia;
}

public String getTemperaturaMaxima() {
return temperaturaMaxima;
}

public String getTemperaturaMinima() {
return temperaturaMinima;
}

public String toString(){
return fecha + " : " + estadoCielo + " : " + temperaturaMaxima + " : " + temperaturaMinima;

}

public ImageIcon getIconoEstadoCielo() {
return icono;
}

}


clase poblacion

Código (java) [Seleccionar]
package 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>,
Serializable, IPoblacionAEMET {

/**
*
*/
private static final long serialVersionUID = 1L;
private String nombre;
private int habitantes;
private String provincia;
private String codigoAEMET;
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,
String codigoAEMET) {
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
*/
public String getNombre() {
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
*/
public String toString() {
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) {
throw new NullPointerException();
} 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 almacenpoblaciones

Código (java) [Seleccionar]
package 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)) {
System.out
.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)) {
System.out
.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) {
ObjectOutputStream salida = null;
try {
salida = new ObjectOutputStream(new FileOutputStream(escritura));
salida.writeObject(Aprovincias);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (salida != null)
try {
salida.close();
System.out.println("Guardado");
return true;
} catch (IOException e) {
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) {
ObjectInputStream entrada = null;
try {
entrada = new ObjectInputStream(new FileInputStream(lectura));

Aprovincias = (Map<String, SortedSet<IPoblacion>>) entrada
.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (entrada != null)
try {
entrada.close();
return true;
} catch (IOException e) {
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

kikian94

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:

Código (java) [Seleccionar]
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 JTree tree;
private JTree treeDatos;
private DefaultTreeModel modeloArbol;
private DefaultTreeModel modelo;
private DefaultMutableTreeNode selectedNode;
private String nombrePoblacion;
private JTable tabla;
private TableModel d;
/**
* 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());
this.add(addJToolBar(), BorderLayout.NORTH);
this.add(addlineaEstado(), BorderLayout.SOUTH);
  //Creamos el splitpanel y lo colocamos en medio del jtree y la tabla, despues lo añadimos al Jframe
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,addPanelIzquierda(),addpredicciones());
    splitPane.setOneTouchExpandable(true);
    splitPane.setDividerLocation(100);
    splitPane.setDividerSize(10);
    this.add(splitPane,BorderLayout.CENTER);
}

private JMenuBar addJMenuBar() {
// Sitúo los menús desplegables
JMenuBar barraDeMenu = new JMenuBar();
// Creo el menú Archivo
JMenu menuArchivo = new JMenu("Archivo");
JMenuItem crearGuardar = new JMenuItem("Guardar");
JMenuItem crearCargar = new JMenuItem("Cargar");
JMenuItem salir = new JMenuItem("Salir");
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
JMenu menuProvincias = new JMenu("Provincias");
JMenuItem crearProvincias = new JMenuItem("Crear provincia");
JMenuItem borrarProvincias = new JMenuItem("Borrar provincia");
crearProvincias.addActionListener(new Controller());
borrarProvincias.addActionListener(new Controller());
menuProvincias.add(crearProvincias);
menuProvincias.add(borrarProvincias);

// Creo el menu Poblaciones
JMenu menuPoblaciones = new JMenu("Poblaciones");
JMenuItem crearPoblacion = new JMenuItem("Crear poblacion");
JMenuItem borrarPoblacion = new JMenuItem("Borrar poblacion");
JMenuItem ordenarNombre = new JMenuItem("Ordenar por nombre");
JMenuItem ordenarHabitantes = new JMenuItem("Ordenar por habitantes");
JMenuItem modPoblacion = new JMenuItem("Modificar poblacion");
JMenuItem movPoblacion = new JMenuItem("Mover poblacion");
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
JMenu ayuda = new JMenu("Ayuda");
JMenuItem acercaDe = new JMenuItem("Acerca de");
acercaDe.addActionListener(new AcercaDe());
ayuda.add(acercaDe);

// Crea el
barraDeMenu.add(menuArchivo);
barraDeMenu.add(menuProvincias);
barraDeMenu.add(menuPoblaciones);
barraDeMenu.add(ayuda);
return barraDeMenu;
}

private JToolBar addJToolBar() {
// Sitúo la línea de botones
JToolBar lineaDeBotones = new JToolBar();
lineaDeBotones.setBackground(new Color(200,100,100));

// Boton crear provincia
Icon Iprovincia= new ImageIcon(getClass().getResource("/iconos/provincia.png"));
JButton proCrear = new JButton("Crear provincia",Iprovincia);
proCrear.addActionListener(new Controller());

// Boton crear poblacion
Icon Ipoblacion= new ImageIcon(getClass().getResource("/iconos/poblacion.png"));
JButton poCrear = new JButton("Crear poblacion",Ipoblacion);
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
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree.addTreeSelectionListener(new TreeSelectionListener(){
@Override
public void valueChanged(TreeSelectionEvent se) {
treeDatos = (JTree) se.getSource();
selectedNode = (DefaultMutableTreeNode) treeDatos.getLastSelectedPathComponent();
    nombrePoblacion = selectedNode.toString();
    if (selectedNode.isLeaf()) {
      System.out.println(nombrePoblacion);
      System.out.println(selectedNode.getParent().toString());
    }
}
        });
        tree.setBorder(BorderFactory.createLineBorder(Color.blue));
       
return tree;
}

public void CrearArbol(){
DefaultMutableTreeNode provinciasPrincipal = new DefaultMutableTreeNode("Provincias");
modelo = new DefaultTreeModel(provinciasPrincipal);
    tree = new JTree(modelo);
for(String s : almacen.getProvincias()){
        int j = 0;
        DefaultMutableTreeNode provincia = new DefaultMutableTreeNode(s);
        modelo.insertNodeInto(provincia, provinciasPrincipal, j);
        j++;
        for(IPoblacion i : almacen.getPoblaciones(s)){
        int x = 0;
        DefaultMutableTreeNode poblacion = new DefaultMutableTreeNode(i.getNombre());
        modelo.insertNodeInto(poblacion, provincia, x);
        x++;
        }
        }

}

private JPanel addpredicciones() {
// Creamos la tabla de las predicciones
JPanel predicciones = new JPanel(new BorderLayout());
d = new TableModel();
tabla = new JTable(d);
JLabel lPrediccion = new JLabel("Predicciones de :");
//predicciones.add(lPrediccion, BorderLayout.NORTH);
predicciones.add(lPrediccion,BorderLayout.NORTH);
predicciones.add(tabla,BorderLayout.CENTER);
predicciones.setBackground(Color.white);
predicciones.setBorder(BorderFactory.createLineBorder(Color.blue));
return predicciones;
}

private JPanel addlineaEstado() {
// Sitúo la línea de estado
JPanel lineaDeEstado = new JPanel();
lineaDeEstado.setLayout(new FlowLayout(FlowLayout.LEFT));
lineaDeEstado.setBackground(new Color(0,80,80));
JLabel ventanaDeeventos = new JLabel("Gestor AEMET v2.0 (PAA)",SwingConstants.CENTER);
ventanaDeeventos.setForeground(new Color(200,200,60));
ventanaDeeventos.setHorizontalAlignment(SwingConstants.CENTER);
ventanaDeeventos.setVerticalAlignment(SwingConstants.CENTER);
lineaDeEstado.add(ventanaDeeventos);
return lineaDeEstado;
}

private void guardarAntesDeSalir() {

// Guardar almacen
almacen.guardar(FICHERO);
System.out.println("Gracias por utilizar nuestro programa");
}

class Controller implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
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":
System.exit(0);
break;
case "Crear provincia":
String crearProvincia = JOptionPane.showInputDialog(null,"Provincia:","Nueva provincia",JOptionPane.QUESTION_MESSAGE);
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":
String borrarProvincia = JOptionPane.showInputDialog(null,"Provincia:","Eliminar provincia",JOptionPane.QUESTION_MESSAGE);
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{

}
} catch( NullPointerException | GestorAEMETException gae ) {
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".
*/
class AcercaDe implements ActionListener { // Clase interna
@Override
public void actionPerformed(ActionEvent e) {
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:

Código (java) [Seleccionar]
package principal;

import java.util.Iterator;

import javax.swing.table.AbstractTableModel;

import paa.provincias.IPrediccion;

public class TableModel extends AbstractTableModel{

/**
*
*/
private static final long serialVersionUID = 1L;
String columnas[] = {"Fecha", "Temp. Mínima", "Temp. Máxima", "Icono","Estado del cielo"};
Object[][] data;
public java.util.List<IPrediccion> predicciones;

public TableModel() {
data = new Object[7][5];
for(int i = 0; i < 7; i++ ){
for(int j = 0; j < 5;j++){
data[i][j] = new String("*");
}
}
}

@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();
    }
    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++;
}
}


}