Foro de elhacker.net

Programación => Java => Mensaje iniciado por: kikian94 en 28 Marzo 2015, 16:11 pm



Título: Mostrar List al pulsar en un elemento de otra List en AWT
Publicado por: kikian94 en 28 Marzo 2015, 16:11 pm
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
Código
  1. package principal;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import Poblacion.VentanaBorrarPoblacion;
  5. import Poblacion.VentanaCrearPoblacion;
  6. import Provincia.VentanaBorrarProvincia;
  7. import Provincia.VentanaCrearProvincia;
  8. import paa.provincias.GestorAEMET;
  9. import paa.provincias.GestorAEMETException;
  10. import paa.provincias.IPoblacion;
  11.  
  12. /**
  13.  * Fichero: InterfazAWT_AEMET.java Clase que implementa la Interfaz Gráfica
  14.  * AEMET con awt.
  15.  *
  16.  * @author PAA
  17.  * @version 1.0
  18.  */
  19. public class InterfazAWT_AEMET extends Frame {
  20. /**
  21. *
  22. */
  23. private static final long serialVersionUID = 502635761186556414L;
  24.  
  25. private static final String FICHERO = "almacen.dat";
  26. private AlmacenPoblaciones almacen;
  27.  
  28. // private IAlmacenPoblaciones almacenPoblaciones;
  29. private List listaPoblaciones = new List();
  30. private List listaPredicciones = new List();
  31. private List listaProvincias = new List();
  32. private InterfazAWT_AEMET gui;
  33. /**
  34. * Constructor.
  35. *
  36. * @throws GestorAEMETException
  37. */
  38. public InterfazAWT_AEMET(String titulo, int ancho, int alto) {
  39. super(titulo);
  40.  
  41. setSize(ancho, alto);
  42. setLocationRelativeTo(null);
  43. setLayout(new BorderLayout()); // Layout de la aplicación, podría ser otro
  44. almacen = RecuperarAlmacenPoblaciones();
  45. System.out.println(almacen.getProvincias());
  46. initComponents();
  47. for(String provincia : almacen.getProvincias()){
  48. listaProvincias.add(provincia);
  49. /*if(listaProvincias.getSelectedItem()==null){
  50. listaPoblaciones.add(almacen.getPoblaciones(listaProvincias.getSelectedItem()));
  51. }
  52. for(IPoblacion s : almacen.getPoblaciones(listaProvincias.getSelectedItem())){
  53.  
  54. }*/
  55. }
  56. //Imprimimos provincias y poblaciones en las listas
  57. }
  58.  
  59. public AlmacenPoblaciones RecuperarAlmacenPoblaciones() {
  60. // Recuperamos el almacén
  61. AlmacenPoblaciones almacenPoblaciones1 = new AlmacenPoblaciones();
  62.  
  63. if (almacenPoblaciones1.recuperar(FICHERO))
  64. System.out.println("Recuperado el almacen del fichero " + FICHERO);
  65. else
  66. System.out.println("No se pudo recuperar el almacen del fichero "+ FICHERO);
  67. return almacenPoblaciones1;
  68.  
  69. }
  70.  
  71. private void initComponents() {
  72.  
  73. // Boton salir por defecto
  74. addWindowListener(new WindowAdapter() {
  75. public void windowClosing(WindowEvent e) {
  76. guardarAntesDeSalir();
  77. System.exit(0);
  78. }
  79. });
  80.  
  81. setMenuBar(addMenuBar());
  82. this.add(addToolBar(), BorderLayout.NORTH);
  83. this.add(addlineaEstado(), BorderLayout.SOUTH);
  84. this.add(addPanelIzquierda(), BorderLayout.WEST);
  85. this.add(addpredicciones(), BorderLayout.CENTER);
  86. }
  87.  
  88. private MenuBar addMenuBar() {
  89. // Sitúo los menús desplegables
  90. MenuBar barraDeMenu = new MenuBar();
  91.  
  92. // Creo el menú Archivo
  93. Menu menuArchivo = new Menu("Archivo");
  94. MenuItem crearGuardar = new MenuItem("Guardar");
  95. MenuItem crearCargar = new MenuItem("Cargar");
  96. MenuItem salir = new MenuItem("Salir");
  97. crearCargar.addActionListener(new Controller());
  98. crearGuardar.addActionListener(new Controller());
  99. salir.addActionListener(new Controller());
  100. menuArchivo.add(crearCargar);
  101. menuArchivo.add(crearGuardar);
  102. menuArchivo.add(salir);
  103.  
  104. // Creo el menú Provincias
  105. Menu menuProvincias = new Menu("Provincias");
  106. MenuItem crearProvincias = new MenuItem("Crear provincia");
  107. MenuItem borrarProvincias = new MenuItem("Borrar provincia");
  108. crearProvincias.addActionListener(new Controller());
  109. borrarProvincias.addActionListener(new Controller());
  110. menuProvincias.add(crearProvincias);
  111. menuProvincias.add(borrarProvincias);
  112.  
  113. // Creo el menu Poblaciones
  114. Menu menuPoblaciones = new Menu("Poblaciones");
  115. MenuItem crearPoblacion = new MenuItem("Crear poblacion");
  116. MenuItem borrarPoblacion = new MenuItem("Borrar poblacion");
  117. MenuItem ordenarNombre = new MenuItem("Ordenar por nombre");
  118. MenuItem ordenarHabitantes = new MenuItem("Ordenar por habitantes");
  119. MenuItem modPoblacion = new MenuItem("Modificar poblacion");
  120. MenuItem movPoblacion = new MenuItem("Mover poblacion");
  121. crearPoblacion.addActionListener(new Controller());
  122. borrarPoblacion.addActionListener(new Controller());
  123. ordenarNombre.addActionListener(new Controller());
  124. ordenarHabitantes.addActionListener(new Controller());
  125. modPoblacion.addActionListener(new Controller());
  126. movPoblacion.addActionListener(new Controller());
  127. menuPoblaciones.add(crearPoblacion);
  128. menuPoblaciones.add(borrarPoblacion);
  129. menuPoblaciones.add(ordenarNombre);
  130. menuPoblaciones.add(ordenarHabitantes);
  131. menuPoblaciones.add(modPoblacion);
  132. menuPoblaciones.add(movPoblacion);
  133.  
  134. // Creo el menú de ayuda
  135. Menu ayuda = new Menu("Ayuda");
  136. MenuItem acercaDe = new MenuItem("Acerca de");
  137. acercaDe.addActionListener(new AcercaDe());
  138. ayuda.add(acercaDe);
  139.  
  140. // Crea el
  141. barraDeMenu.add(menuArchivo);
  142. barraDeMenu.add(menuProvincias);
  143. barraDeMenu.add(menuPoblaciones);
  144. // Sitúo el menú de ayuda en su sitio
  145. barraDeMenu.setHelpMenu(ayuda);
  146. return barraDeMenu;
  147. }
  148.  
  149. private Panel addToolBar() {
  150. // Sitúo la línea de botones
  151. Panel lineaDeBotones = new Panel(new FlowLayout(FlowLayout.LEFT));
  152. lineaDeBotones.setBackground(Color.lightGray);
  153.  
  154. // Boton crear provincia
  155. Button proCrear = new Button("Crear provincia");
  156. proCrear.addActionListener(new Controller());
  157.  
  158. // Boton crear poblacion
  159. Button poCrear = new Button("Crear poblacion");
  160. poCrear.addActionListener(new Controller());
  161.  
  162. // Boton actualizar prediccion
  163. Button aPrediccion = new Button("Actualizar Predicción");
  164. aPrediccion.addActionListener(new Controller());
  165.  
  166. // Añadir los botones a la barra
  167. lineaDeBotones.add(proCrear);
  168. lineaDeBotones.add(poCrear);
  169. lineaDeBotones.add(aPrediccion);
  170. return lineaDeBotones;
  171. }
  172.  
  173. private Panel addPanelIzquierda() {
  174. // Creamos panel para mostrar provincias y poblaciones y lo colocamos a
  175. // la izquierda
  176. Panel izquierda = new Panel(new GridLayout(4, 1));
  177. Label lProvincia = new Label("Provincias:");
  178. Label lPoblacion = new Label("Poblaciones:");
  179. izquierda.add(lProvincia);
  180. izquierda.add(listaProvincias);
  181. izquierda.add(lPoblacion);
  182. izquierda.add(listaPoblaciones);
  183. return izquierda;
  184. }
  185.  
  186. private Panel addpredicciones() {
  187. // Creamos el panel de las predicciones
  188. Panel predicciones = new Panel(new BorderLayout());
  189. Label lPrediccion = new Label("Predicciones de :");
  190. List tPrediccion = new List();
  191. predicciones.add(lPrediccion, BorderLayout.NORTH);
  192. predicciones.add(tPrediccion, BorderLayout.CENTER);
  193. return predicciones;
  194. }
  195.  
  196. private Panel addlineaEstado() {
  197. // Sitúo la línea de estado
  198. Panel lineaDeEstado = new Panel();
  199. lineaDeEstado.setLayout(new FlowLayout(FlowLayout.LEFT));
  200. lineaDeEstado.setBackground(Color.lightGray);
  201. Label ventanaDeeventos = new Label("Gestor AEMET v1.0 (PAA)");
  202. lineaDeEstado.add(ventanaDeeventos);
  203. return lineaDeEstado;
  204. }
  205.  
  206. private void guardarAntesDeSalir() {
  207.  
  208. // Guardar almacen
  209. almacen.guardar(FICHERO);
  210. System.out.println("Gracias por utilizar nuestro programa");
  211. }
  212.  
  213. class Controller implements ActionListener {
  214.  
  215. public void actionPerformed(ActionEvent e) {
  216. String nombre = e.getActionCommand();
  217. EvaluarAccion(nombre);
  218. }
  219.  
  220. public void EvaluarAccion(String accion) {
  221.  
  222. switch (accion) {
  223. case "Guardar":
  224. almacen.guardar(FICHERO);
  225. Aviso guardar = new Aviso(gui, "Archivo guardado");
  226. break;
  227. case "Salir":
  228. System.exit(0);
  229. break;
  230. case "Crear provincia":
  231. new VentanaCrearProvincia(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
  232. break;
  233. case "Borrar provincia":
  234. new VentanaBorrarProvincia(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
  235. break;
  236. case "Crear poblacion":
  237. new VentanaCrearPoblacion(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
  238. break;
  239. case "Borrar poblacion":
  240. new VentanaBorrarPoblacion(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
  241. break;
  242. case "Ordenar por nombre":
  243. break;
  244. case "Ordenar por habitantes":
  245. break;
  246. case "Modificar poblacion":
  247. break;
  248. case "Mover poblacion":
  249. break;
  250. }
  251. }
  252. }
  253.  
  254. /**
  255. * Clase que implementa la acción del menú "acerca de".
  256. */
  257. class AcercaDe implements ActionListener { // Clase interna
  258. public void actionPerformed(ActionEvent e) {
  259. VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe(
  260. InterfazAWT_AEMET.this);
  261. ventanaAcercaDe.setVisible(true);
  262. }
  263. }// Acerca de
  264.  
  265. /**
  266. * Método main.
  267. * @throws GestorAEMETException
  268. */
  269. public static void main(String[] args) throws GestorAEMETException {
  270.  
  271. InterfazAWT_AEMET mimarco = new InterfazAWT_AEMET("Gestor AEMET", 1000,
  272. 500);
  273. mimarco.setVisible(true);
  274. } // Main
  275. }
  276.  

La que crea provincia:
Código
  1. package Provincia;
  2. import java.awt.Button;
  3. import java.awt.Dialog;
  4. import java.awt.Frame;
  5. import java.awt.GridLayout;
  6. import java.awt.Label;
  7. import java.awt.List;
  8. import java.awt.Panel;
  9. import java.awt.TextField;
  10. import java.awt.event.ActionEvent;
  11. import java.awt.event.ActionListener;
  12. import java.awt.event.WindowAdapter;
  13. import java.awt.event.WindowEvent;
  14.  
  15. import principal.AlmacenPoblaciones;
  16. import principal.Aviso;
  17.  
  18.  
  19. public class VentanaCrearProvincia extends Dialog {
  20.  
  21. private Button crear;
  22. private Button cancelar;
  23. private AlmacenPoblaciones almacen;
  24. private List listaPoblaciones;
  25. private List listaPredicciones;
  26. private List listaProvincias;
  27. private TextField textField;
  28. private static final long serialVersionUID = -2530069431684593677L;
  29.  
  30. public VentanaCrearProvincia(Frame gui, AlmacenPoblaciones almacen, List listaPoblaciones, List listaProvincias, List listaPredicciones) {
  31. super(gui);
  32.  
  33. this.almacen = almacen;
  34. this.listaPoblaciones = listaPoblaciones;
  35. this.listaProvincias = listaProvincias;
  36. this.listaPredicciones = listaPredicciones;
  37. initComponents(gui);
  38. }
  39.  
  40. public void initComponents (Frame gui){
  41. Panel panel = new Panel(new GridLayout(2,2,0,0));
  42. Label label = new Label("Provincia:");
  43. textField = new TextField();
  44. crear = new Button("Crear");
  45. cancelar = new Button("Cancelar");
  46. setLocationRelativeTo(gui);
  47. this.setTitle("Crear Provincia");
  48. this.setSize(300, 100);
  49. panel.add(label);
  50. panel.add(textField);
  51. panel.add(crear);
  52. panel.add(cancelar);
  53. crear.addActionListener(new Controller());
  54. cancelar.addActionListener(new Controller());
  55. this.add(panel);
  56. addWindowListener (new WindowAdapter (){
  57.          public void windowClosing(WindowEvent e) {
  58.          VentanaCrearProvincia.this.dispose();
  59.             }
  60.          });
  61. }
  62. public class Controller implements ActionListener {
  63. public void actionPerformed(ActionEvent e) {
  64. String label = e.getActionCommand();
  65. if(label.equals("Crear")){
  66. try{
  67. almacen.addProvincia(textField.getText());
  68. listaProvincias.removeAll();
  69. for(String provincia : almacen.getProvincias()){
  70. listaProvincias.add(provincia);
  71. }
  72. System.out.println(almacen.getProvincias());
  73. VentanaCrearProvincia.this.dispose();
  74.  
  75. Aviso aviso = new Aviso(VentanaCrearProvincia.this,e1.getMessage());
  76. }
  77. }else{
  78.  
  79. VentanaCrearProvincia.this.dispose();
  80. }
  81. }
  82.  
  83. }
  84. }
  85.  
y la que crea poblacion

Código
  1. package Poblacion;
  2. import java.awt.BorderLayout;
  3. import java.awt.Button;
  4. import java.awt.Dialog;
  5. import java.awt.FlowLayout;
  6. import java.awt.Frame;
  7. import java.awt.GridLayout;
  8. import java.awt.Label;
  9. import java.awt.List;
  10. import java.awt.Panel;
  11. import java.awt.TextField;
  12. import java.awt.event.ActionEvent;
  13. import java.awt.event.ActionListener;
  14. import java.awt.event.ItemEvent;
  15. import java.awt.event.WindowAdapter;
  16. import java.awt.event.WindowEvent;
  17.  
  18. import paa.provincias.IPoblacion;
  19. import principal.AlmacenPoblaciones;
  20. import principal.Aviso;
  21. import principal.Poblacion;
  22.  
  23. public class VentanaCrearPoblacion extends Dialog {
  24.  
  25. private Button crear;
  26. private Button cancelar;
  27. private AlmacenPoblaciones almacen;
  28. private List listaPoblaciones;
  29. private List listaPredicciones;
  30. private List listaProvincias;
  31. private TextField nombre;
  32. private TextField habitantes;
  33. private TextField codigo;
  34. private static final long serialVersionUID = 1434307119439314094L;
  35.  
  36. public VentanaCrearPoblacion(Frame gui, AlmacenPoblaciones almacen, List listaPoblaciones, List listaProvincias, List listaPredicciones) {
  37. super(gui);
  38. this.almacen = almacen;
  39. this.listaPoblaciones = listaPoblaciones;
  40. this.listaProvincias = listaProvincias;
  41. this.listaPredicciones = listaPredicciones;
  42. if(listaProvincias.getSelectedItem() != null){
  43. initComponents(gui);
  44. }else{
  45. Aviso aviso = new Aviso(gui,"Selecciona una provincia");
  46. gui.dispose();
  47. }
  48.  
  49. }
  50. public void initComponents(Frame gui){
  51. setLocationRelativeTo(gui);
  52. this.setLayout(new BorderLayout());
  53. this.setTitle("Crear Poblacion");
  54. this.setSize(300, 200);
  55. Panel texto = new Panel(new GridLayout(4,1,0,0));
  56. Panel panel = new Panel(new FlowLayout());
  57. crear = new Button("Crear");
  58. cancelar = new Button("Cancelar");
  59. nombre = new TextField("Nombre");
  60. Label nombreP = new Label(listaProvincias.getSelectedItem());
  61. habitantes = new TextField("Habitantes");
  62. codigo = new TextField("CodigoAEMET");
  63. crear.addActionListener(new Controller());
  64. cancelar.addActionListener(new Controller());
  65.  
  66. texto.add(nombre);
  67. texto.add(nombreP);
  68. texto.add(habitantes);
  69. texto.add(codigo);
  70. panel.add(crear);
  71. panel.add(cancelar);
  72.  
  73. this.add(texto, BorderLayout.CENTER);
  74. this.add(panel,BorderLayout.SOUTH);
  75.  
  76. addWindowListener (new WindowAdapter (){
  77.          public void windowClosing(WindowEvent e) {
  78.          VentanaCrearPoblacion.this.dispose();
  79.             }
  80.          });
  81. }
  82. class Controller implements ActionListener {
  83. private VentanaCrearPoblacion gui;
  84. public void actionPerformed(ActionEvent e) {
  85. String label = e.getActionCommand();
  86. if(label.equals("Crear")){
  87. try{
  88. IPoblacion poblacion = new Poblacion(nombre.getText(), Integer.parseInt(habitantes.getText()), listaProvincias.getSelectedItem(), codigo.getText());
  89. almacen.addPoblacion(listaProvincias.getSelectedItem(),poblacion);
  90.  
  91. //listaPoblaciones2.removeAll();
  92. for(IPoblacion p : almacen.getPoblaciones(listaProvincias.getSelectedItem())){
  93. listaPoblaciones.add(poblacion.getNombre());
  94. }
  95.  
  96. VentanaCrearPoblacion.this.dispose();
  97.  
  98.  
  99.  
  100. Aviso aviso = new Aviso(gui,e1.getMessage());
  101. }
  102. }else{
  103. VentanaCrearPoblacion.this.dispose();
  104. }
  105. }
  106. }
  107.  
  108. }
  109.  

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


Título: Re: Mostrar List al pulsar en un elemento de otra List en AWT
Publicado por: Usuario Invitado en 28 Marzo 2015, 16:45 pm
Intenta ésto:

Código
  1. provincesList.addItemListener(new ItemListener() {
  2. public void itemStateChanged(ItemEvent event) {
  3. Province province = (Province) event.getItem();
  4. populationList.removeAll(); // remueve todo el contenido
  5. // itera el Set de poblaciones de la provincia elegida
  6. for(Set<Population> populations : province.getPopulations()) {
  7. for(Population population : populations) {
  8. // Population debe de sobreescribir toString()
  9. populationList.add(population.toString());
  10. }
  11. }
  12. }
  13. }

También lo puedes hacer desde el controlador. Para las predicciones es la misma idea.


Saludos.


Título: Re: Mostrar List al pulsar en un elemento de otra List en AWT
Publicado por: kikian94 en 28 Marzo 2015, 17:26 pm
donde debo de introducir ese metodo?,
lo he puesto a continuacion de la creacion de la list:
Código
  1. private Panel addPanelIzquierda() {
  2. // Creamos panel para mostrar provincias y poblaciones y lo colocamos a
  3. // la izquierda
  4. Panel izquierda = new Panel(new GridLayout(4, 1));
  5. Label lProvincia = new Label("Provincias:");
  6. Label lPoblacion = new Label("Poblaciones:");
  7. listaPoblaciones.addActionListener(new Controller());
  8. listaProvincias.addItemListener(new ItemListener() {
  9. public void itemStateChanged(ItemEvent event) {
  10. String province = (String) event.getItem();
  11. listaPoblaciones.removeAll();
  12. for(SortedSet<IPoblacion> set : almacen.getPoblaciones(province)){
  13. for(IPoblacion p : set) {
  14. listaPoblaciones.add(p.getNombre());
  15. }
  16. }
  17. }
  18. });
  19.  
  20. izquierda.add(lProvincia);
  21. izquierda.add(listaProvincias);
  22. izquierda.add(lPoblacion);
  23. izquierda.add(listaPoblaciones);
  24. return izquierda;
  25. }

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
  1. class Controller implements ActionListener {
  2.  
  3. public void actionPerformed(ActionEvent e) {
  4. String nombre = e.getActionCommand();
  5. if(listaProvincias.getSelectedItem()!=null){
  6. listaPoblaciones.removeAll();
  7. for(IPoblacion p : almacen.getPoblaciones(listaProvincias.getSelectedItem())){
  8. listaPoblaciones.add(p.getNombre());
  9. }
  10. }
  11. EvaluarAccion(nombre);
  12.  
  13. }
pero claro con doble click no me vale, tiene que ser con uno solo y no me sale, ya que da error


Título: Re: Mostrar List al pulsar en un elemento de otra List en AWT
Publicado por: kikian94 en 28 Marzo 2015, 17:30 pm
me ha salido!!!, mira:
Código
  1. private Panel addPanelIzquierda() {
  2. // Creamos panel para mostrar provincias y poblaciones y lo colocamos a
  3. // la izquierda
  4. Panel izquierda = new Panel(new GridLayout(4, 1));
  5. Label lProvincia = new Label("Provincias:");
  6. Label lPoblacion = new Label("Poblaciones:");
  7. listaPoblaciones.addActionListener(new Controller());
  8. listaProvincias.addItemListener(new ItemListener() {
  9. public void itemStateChanged(ItemEvent event) {
  10. String province = listaProvincias.getSelectedItem();
  11. listaPoblaciones.removeAll();
  12. for(IPoblacion p : almacen.getPoblaciones(province)) {
  13. listaPoblaciones.add(p.getNombre());
  14. }
  15. }
  16. });
  17.  
  18. izquierda.add(lProvincia);
  19. izquierda.add(listaProvincias);
  20. izquierda.add(lPoblacion);
  21. izquierda.add(listaPoblaciones);
  22. return izquierda;
  23. }
en vez de utilizar getItem utilizo getSelectedItem y me funciona correctamente, voy a mirar lo de las predicciones ;)


Título: Re: Mostrar List al pulsar en un elemento de otra List en AWT
Publicado por: Usuario Invitado en 28 Marzo 2015, 17:33 pm
Simplemente haz un cambio:

Código
  1. String province = event.getSelectedItem();
  2. populationList.removeAll();
  3. ProvinceService service = new ProvinceService();
  4. // obtienes las poblaciones (yo te habia hecho un metodo, &#191;recuerdas?)
  5. for(Set<Popuplation> populations : service.getPopulations(provice)) {
  6. for(Population population : populations) {
  7. populationList.add(population.toString());
  8. }
  9. }

EDIT: Recién veo tu respuesta anterior ^^.