Hola, necesito crear una aplicacion para informar del tiempo de las provincias que se vayan añadiendo y tengo un problema a la hora de configurar la pantalla del programa:
(http://i.imgur.com/xrXTY2z.png)
Lo que debo de hacer es que al pulsar en una provincia automaticamente en la lista de debajo aparezcan las poblaciones creadas en esa provincia y que si hago doble click en una provincia en el panel de la derecha me aparezcan los datos relacionados con las predicciones, mis clases son estas:
La principal
package principal;
import java.awt.*;
import java.awt.event.*;
import Poblacion.VentanaBorrarPoblacion;
import Poblacion.VentanaCrearPoblacion;
import Provincia.VentanaBorrarProvincia;
import Provincia.VentanaCrearProvincia;
import paa.provincias.GestorAEMET;
import paa.provincias.GestorAEMETException;
import paa.provincias.IPoblacion;
/**
* Fichero: InterfazAWT_AEMET.java Clase que implementa la Interfaz Gráfica
* AEMET con awt.
*
* @author PAA
* @version 1.0
*/
public class InterfazAWT_AEMET extends Frame {
/**
*
*/
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;
/**
* 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();
System.out.println(almacen.getProvincias());
initComponents();
for(String provincia : almacen.getProvincias()){
listaProvincias.add(provincia);
/*if(listaProvincias.getSelectedItem()==null){
listaPoblaciones.add(almacen.getPoblaciones(listaProvincias.getSelectedItem()));
}
for(IPoblacion s : almacen.getPoblaciones(listaProvincias.getSelectedItem())){
}*/
}
//Imprimimos provincias y poblaciones en las listas
}
public AlmacenPoblaciones RecuperarAlmacenPoblaciones() {
// Recuperamos el almacén
AlmacenPoblaciones almacenPoblaciones1 = new AlmacenPoblaciones();
if (almacenPoblaciones1.recuperar(FICHERO))
System.out.println("Recuperado el almacen del fichero " + FICHERO);
else
System.out.println("No se pudo recuperar el almacen del fichero "+ FICHERO);
return almacenPoblaciones1;
}
private void initComponents() {
// Boton salir por defecto
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
guardarAntesDeSalir();
System.exit(0);
}
});
setMenuBar(addMenuBar());
this.add(addToolBar(), BorderLayout.NORTH);
this.add(addlineaEstado(), BorderLayout.SOUTH);
this.add(addPanelIzquierda(), BorderLayout.WEST);
this.add(addpredicciones(), BorderLayout.CENTER);
}
private MenuBar addMenuBar() {
// Sitúo los menús desplegables
MenuBar barraDeMenu = new MenuBar();
// Creo el menú Archivo
Menu menuArchivo = new Menu("Archivo");
MenuItem crearGuardar = new MenuItem("Guardar");
MenuItem crearCargar = new MenuItem("Cargar");
MenuItem salir = new MenuItem("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
Menu menuProvincias = new Menu("Provincias");
MenuItem crearProvincias = new MenuItem("Crear provincia");
MenuItem borrarProvincias = new MenuItem("Borrar provincia");
crearProvincias.addActionListener(new Controller());
borrarProvincias.addActionListener(new Controller());
menuProvincias.add(crearProvincias);
menuProvincias.add(borrarProvincias);
// Creo el menu Poblaciones
Menu menuPoblaciones = new Menu("Poblaciones");
MenuItem crearPoblacion = new MenuItem("Crear poblacion");
MenuItem borrarPoblacion = new MenuItem("Borrar poblacion");
MenuItem ordenarNombre = new MenuItem("Ordenar por nombre");
MenuItem ordenarHabitantes = new MenuItem("Ordenar por habitantes");
MenuItem modPoblacion = new MenuItem("Modificar poblacion");
MenuItem movPoblacion = new MenuItem("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
Menu ayuda = new Menu("Ayuda");
MenuItem acercaDe = new MenuItem("Acerca de");
acercaDe.addActionListener(new AcercaDe());
ayuda.add(acercaDe);
// Crea el
barraDeMenu.add(menuArchivo);
barraDeMenu.add(menuProvincias);
barraDeMenu.add(menuPoblaciones);
// Sitúo el menú de ayuda en su sitio
barraDeMenu.setHelpMenu(ayuda);
return barraDeMenu;
}
private Panel addToolBar() {
// Sitúo la línea de botones
Panel lineaDeBotones = new Panel(new FlowLayout(FlowLayout.LEFT));
lineaDeBotones.setBackground(Color.lightGray);
// Boton crear provincia
Button proCrear = new Button("Crear provincia");
proCrear.addActionListener(new Controller());
// Boton crear poblacion
Button poCrear = new Button("Crear poblacion");
poCrear.addActionListener(new Controller());
// Boton actualizar prediccion
Button aPrediccion = new Button("Actualizar Predicción");
aPrediccion.addActionListener(new Controller());
// Añadir los botones a la barra
lineaDeBotones.add(proCrear);
lineaDeBotones.add(poCrear);
lineaDeBotones.add(aPrediccion);
return lineaDeBotones;
}
private Panel addPanelIzquierda() {
// Creamos panel para mostrar provincias y poblaciones y lo colocamos a
// la izquierda
Panel izquierda = new Panel(new GridLayout(4, 1));
Label lProvincia = new Label("Provincias:");
Label lPoblacion = new Label("Poblaciones:");
izquierda.add(lProvincia);
izquierda.add(listaProvincias);
izquierda.add(lPoblacion);
izquierda.add(listaPoblaciones);
return izquierda;
}
private Panel addpredicciones() {
// Creamos el panel de las predicciones
Panel predicciones = new Panel(new BorderLayout());
Label lPrediccion = new Label("Predicciones de :");
List tPrediccion = new List();
predicciones.add(lPrediccion, BorderLayout.NORTH);
predicciones.add(tPrediccion, BorderLayout.CENTER);
return predicciones;
}
private Panel addlineaEstado() {
// Sitúo la línea de estado
Panel lineaDeEstado = new Panel();
lineaDeEstado.setLayout(new FlowLayout(FlowLayout.LEFT));
lineaDeEstado.setBackground(Color.lightGray);
Label ventanaDeeventos = new Label("Gestor AEMET v1.0 (PAA)");
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);
Aviso guardar = new Aviso(gui, "Archivo guardado");
break;
case "Salir":
System.exit(0);
break;
case "Crear provincia":
new VentanaCrearProvincia(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
break;
case "Borrar provincia":
new VentanaBorrarProvincia(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
break;
case "Crear poblacion":
new VentanaCrearPoblacion(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
break;
case "Borrar poblacion":
new VentanaBorrarPoblacion(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
break;
case "Ordenar por nombre":
break;
case "Ordenar por habitantes":
break;
case "Modificar poblacion":
break;
case "Mover poblacion":
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.setVisible(true);
} // Main
}
La que crea provincia:
package Provincia;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import principal.AlmacenPoblaciones;
import principal.Aviso;
public class VentanaCrearProvincia extends Dialog {
private Button crear;
private Button cancelar;
private AlmacenPoblaciones almacen;
private List listaPoblaciones;
private List listaPredicciones;
private List listaProvincias;
private TextField textField;
private static final long serialVersionUID = -2530069431684593677L;
public VentanaCrearProvincia(Frame gui, AlmacenPoblaciones almacen, List listaPoblaciones, List listaProvincias, List listaPredicciones) {
super(gui);
this.almacen = almacen;
this.listaPoblaciones = listaPoblaciones;
this.listaProvincias = listaProvincias;
this.listaPredicciones = listaPredicciones;
initComponents(gui);
}
public void initComponents (Frame gui){
Panel panel = new Panel(new GridLayout(2,2,0,0));
Label label = new Label("Provincia:");
textField = new TextField();
crear = new Button("Crear");
cancelar = new Button("Cancelar");
setLocationRelativeTo(gui);
this.setTitle("Crear Provincia");
this.setSize(300, 100);
panel.add(label);
panel.add(textField);
panel.add(crear);
panel.add(cancelar);
crear.addActionListener(new Controller());
cancelar.addActionListener(new Controller());
this.add(panel);
addWindowListener (new WindowAdapter (){
public void windowClosing(WindowEvent e) {
VentanaCrearProvincia.this.dispose();
}
});
}
public class Controller implements ActionListener {
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
if(label.equals("Crear")){
try{
almacen.addProvincia(textField.getText());
listaProvincias.removeAll();
for(String provincia : almacen.getProvincias()){
listaProvincias.add(provincia);
}
System.out.println(almacen.getProvincias());
VentanaCrearProvincia.this.dispose();
}catch (IllegalArgumentException e1){
Aviso aviso = new Aviso(VentanaCrearProvincia.this,e1.getMessage());
}
}else{
VentanaCrearProvincia.this.dispose();
}
}
}
}
y la que crea poblacion
package Poblacion;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import paa.provincias.IPoblacion;
import principal.AlmacenPoblaciones;
import principal.Aviso;
import principal.Poblacion;
public class VentanaCrearPoblacion extends Dialog {
private Button crear;
private Button cancelar;
private AlmacenPoblaciones almacen;
private List listaPoblaciones;
private List listaPredicciones;
private List listaProvincias;
private TextField nombre;
private TextField habitantes;
private TextField codigo;
private static final long serialVersionUID = 1434307119439314094L;
public VentanaCrearPoblacion(Frame gui, AlmacenPoblaciones almacen, List listaPoblaciones, List listaProvincias, List listaPredicciones) {
super(gui);
this.almacen = almacen;
this.listaPoblaciones = listaPoblaciones;
this.listaProvincias = listaProvincias;
this.listaPredicciones = listaPredicciones;
if(listaProvincias.getSelectedItem() != null){
initComponents(gui);
}else{
Aviso aviso = new Aviso(gui,"Selecciona una provincia");
gui.dispose();
}
}
public void initComponents(Frame gui){
setLocationRelativeTo(gui);
this.setLayout(new BorderLayout());
this.setTitle("Crear Poblacion");
this.setSize(300, 200);
Panel texto = new Panel(new GridLayout(4,1,0,0));
Panel panel = new Panel(new FlowLayout());
crear = new Button("Crear");
cancelar = new Button("Cancelar");
nombre = new TextField("Nombre");
Label nombreP = new Label(listaProvincias.getSelectedItem());
habitantes = new TextField("Habitantes");
codigo = new TextField("CodigoAEMET");
crear.addActionListener(new Controller());
cancelar.addActionListener(new Controller());
texto.add(nombre);
texto.add(nombreP);
texto.add(habitantes);
texto.add(codigo);
panel.add(crear);
panel.add(cancelar);
this.add(texto, BorderLayout.CENTER);
this.add(panel,BorderLayout.SOUTH);
addWindowListener (new WindowAdapter (){
public void windowClosing(WindowEvent e) {
VentanaCrearPoblacion.this.dispose();
}
});
}
class Controller implements ActionListener {
private VentanaCrearPoblacion gui;
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
if(label.equals("Crear")){
try{
IPoblacion poblacion = new Poblacion(nombre.getText(), Integer.parseInt(habitantes.getText()), listaProvincias.getSelectedItem(), codigo.getText());
almacen.addPoblacion(listaProvincias.getSelectedItem(),poblacion);
//listaPoblaciones2.removeAll();
for(IPoblacion p : almacen.getPoblaciones(listaProvincias.getSelectedItem())){
listaPoblaciones.add(poblacion.getNombre());
}
VentanaCrearPoblacion.this.dispose();
}catch (IllegalArgumentException e1){
Aviso aviso = new Aviso(gui,e1.getMessage());
}
}else{
VentanaCrearPoblacion.this.dispose();
}
}
}
}
las demas clases no importan ya que son de practicas anteriores o ya me las dan implementadas, en lo que dudo es a la hora de añadir la poblacion, he pensado que la clase ventanaCrearPoblacion solo debe de añadir la poblacion al almacen y que la clase que se debe de encargar de que al pulsar una provincia se muestrren las poblaciones asociadas debe de ser la principal
Intenta ésto:
provincesList.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent event) {
Province province = (Province) event.getItem();
populationList.removeAll(); // remueve todo el contenido
// itera el Set de poblaciones de la provincia elegida
for(Set<Population> populations : province.getPopulations()) {
for(Population population : populations) {
// Population debe de sobreescribir toString()
populationList.add(population.toString());
}
}
}
}
También lo puedes hacer desde el controlador. Para las predicciones es la misma idea.
Saludos.
donde debo de introducir ese metodo?,
lo he puesto a continuacion de la creacion de la list:
private Panel addPanelIzquierda() {
// Creamos panel para mostrar provincias y poblaciones y lo colocamos a
// la izquierda
Panel izquierda = new Panel(new GridLayout(4, 1));
Label lProvincia = new Label("Provincias:");
Label lPoblacion = new Label("Poblaciones:");
listaPoblaciones.addActionListener(new Controller());
listaProvincias.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent event) {
String province = (String) event.getItem();
listaPoblaciones.removeAll();
for(SortedSet<IPoblacion> set : almacen.getPoblaciones(province)){
for(IPoblacion p : set) {
listaPoblaciones.add(p.getNombre());
}
}
}
});
izquierda.add(lProvincia);
izquierda.add(listaProvincias);
izquierda.add(lPoblacion);
izquierda.add(listaPoblaciones);
return izquierda;
}
pero no funciona por que tu me dices que provincia es un objeto, pero en mi codigo son string y cada string tiene asociado un sortedset de poblaciones por lo que me salta error y no compila, he conseguido hacer que funcione pero con doble click añadiendo en controller esto:
class Controller implements ActionListener {
public void actionPerformed(ActionEvent e) {
String nombre = e.getActionCommand();
if(listaProvincias.getSelectedItem()!=null){
listaPoblaciones.removeAll();
for(IPoblacion p : almacen.getPoblaciones(listaProvincias.getSelectedItem())){
listaPoblaciones.add(p.getNombre());
}
}
EvaluarAccion(nombre);
}
pero claro con doble click no me vale, tiene que ser con uno solo y no me sale, ya que da error
me ha salido!!!, mira:
private Panel addPanelIzquierda() {
// Creamos panel para mostrar provincias y poblaciones y lo colocamos a
// la izquierda
Panel izquierda = new Panel(new GridLayout(4, 1));
Label lProvincia = new Label("Provincias:");
Label lPoblacion = new Label("Poblaciones:");
listaPoblaciones.addActionListener(new Controller());
listaProvincias.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent event) {
String province = listaProvincias.getSelectedItem();
listaPoblaciones.removeAll();
for(IPoblacion p : almacen.getPoblaciones(province)) {
listaPoblaciones.add(p.getNombre());
}
}
});
izquierda.add(lProvincia);
izquierda.add(listaProvincias);
izquierda.add(lPoblacion);
izquierda.add(listaPoblaciones);
return izquierda;
}
en vez de utilizar getItem utilizo getSelectedItem y me funciona correctamente, voy a mirar lo de las predicciones ;)
Simplemente haz un cambio:
String province = event.getSelectedItem();
populationList.removeAll();
ProvinceService service = new ProvinceService();
// obtienes las poblaciones (yo te habia hecho un metodo, ¿recuerdas?)
for(Set<Popuplation> populations : service.getPopulations(provice)) {
for(Population population : populations) {
populationList.add(population.toString());
}
}
EDIT: Recién veo tu respuesta anterior ^^.