Mostrar List al pulsar en un elemento de otra List en AWT

Iniciado por kikian94, 28 Marzo 2015, 16:11 PM

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

kikian94

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:


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
Código (java) [Seleccionar]
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:
Código (java) [Seleccionar]
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

Código (java) [Seleccionar]
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

Usuario Invitado

Intenta ésto:

Código (java) [Seleccionar]
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.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

kikian94

donde debo de introducir ese metodo?,
lo he puesto a continuacion de la creacion de la list:
Código (java) [Seleccionar]
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:
Código (java) [Seleccionar]
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

kikian94

me ha salido!!!, mira:
Código (java) [Seleccionar]
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 ;)

Usuario Invitado

#4
Simplemente haz un cambio:

Código (java) [Seleccionar]
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 ^^.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein