Foro de elhacker.net

Programación => Java => Mensaje iniciado por: kikian94 en 12 Marzo 2015, 19:35 pm



Título: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 12 Marzo 2015, 19:35 pm
Hola, tengo que crear una aplicacion que de informacion sobre el tiempo y necesito crear esto:
(http://i.imgur.com/qYU47hP.png?1)

y necesito esto:

(http://i.imgur.com/vy2qGvd.png?1)

la organizacion del frame es borderlayout y habia pensado en poner en la parte izquierda otro layout divido en 2 pero no se como hacerlo


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 12 Marzo 2015, 19:43 pm
No es buena práctica que un JFrame sea hijo de otro JFrame. Usa JDialogs que para eso están, para mostrar ventanas de diálogo, para mostrar las opciones del software, mostrar información de algún evento, realizar una venta, etc.

Así indicas que el JFrame (ventana principal) será padre de un diálogo:

Código
  1. new JDialog(TU_INSTANCIA_DE_FRAME);

Al hacer esto, cuando abras un JDialog no podrás tocar el JFrame mientras no hayas cerrado el JDialog, que siempre es una buena práctica. Por ejemplo, si vas a mostrar información meterorológica de X ciudad, la muestras en un JDialog y ésta bloqueará el JFrame. Hasta que se cierre el JDialog no se podrá seguir revisando información meteorológicas de otras ciudades.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 13 Marzo 2015, 17:11 pm
no puedo utilizar jframe por que estamos haciendo uso de la libreria awt y no se de que manera colocar el layout a la izquierda, y no tiene que abrirse ninguna ventana a no ser que pulse en añadir provincia o añadir poblacion, tiene que quedar como en la fotografia, se como poner cada cosa, pero a la hora de poner 2 textArea, uno para provincia y otro para poblacion no puedo ubicarlos a la zquierda debido a la disposicion del borderlayout por lo que por eso queria añadir otro layout a la izquierda y dentro de este meter 2 textArea


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 13 Marzo 2015, 17:44 pm
AWT también tiene Frame y Dialog. El procedimiento es el mismo. El de la izquierda puede ser un GridLayout, especificas una columna y dos filas y el margen (distancia) vertical.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 13 Marzo 2015, 17:59 pm
a vale, pensaba que jdialog era de swing, si, eso era lo que queria pero no se sintacticamente como poner el gridlayout dentro del borderlayout en la izquierda


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 13 Marzo 2015, 18:45 pm
Agrega un Panel en la parte izquierda, y a ese Panel le asignas el layout GridLayout. Lee la documentación de Oracle, tutoriales, para que veas ejemplos reales.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 14 Marzo 2015, 18:53 pm
He probado con el panel, y si funciona pero tengo un problema no se alinear los elementos, he creado un box layout:
Código
  1. Panel izquierda = new Panel(new GridLayout(4,1));
  2.  
  3. Label lProvincia = new Label("Provincias:");
  4. List tProvincias = new List();
  5. Label lPoblacion = new Label("Poblaciones:");
  6. List tPoblaciones = new List();
  7.  
  8. izquierda.add(lProvincia);
  9. izquierda.add(tProvincias);
  10. izquierda.add(lPoblacion);
  11. izquierda.add(tPoblaciones);
  12.  
  13.  
  14. add (izquierda, BorderLayout.WEST);

(http://i.imgur.com/grZqu7l.png)


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 14 Marzo 2015, 21:21 pm
Cuando tengas una duda, primero consulta la documentación. Para eso está, para que los programadores la consulten ante cualquier duda. Aquí tienes la documentación de GridLayout: GridLayout (http://docs.oracle.com/javase/7/docs/api/java/awt/GridLayout.html).

Como se puede observar tiene sobrecarga de constructores. El otro constructor acepta 4 parámetros, siendo los últimos el espaciado horizontal y el espaciado vertical. Juega con éstos valores a ver si consigues lo que deseas hacer.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 15 Marzo 2015, 08:53 am
estuve mirando ayer pero cambiando valores me seguia saliendo igual, y otra cosa, al pulsar el boton crear provincia me tiene que saltar una ventanita para que indique nombre de provincia y le de a crear o cancelar, pero no se el orden que debo de seguir, creo el action listener del boton crear provincia y luego para el boton del dialogo crear, el action listener lo tengo que crear dentro del primero o en una clase independiente?, muchas gracias


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 15 Marzo 2015, 18:27 pm
Yo siempre recomiendo aislar la lógica, el dominio de las vistas. Aplicar el patrón MVC para desacoplar tu aplicación te ahorrará muchos problemas.

Por ejemplo, supongamos que tienes tu Frame o JFrame (Dile con todo respeto a tu profesor que no enseñe tecnologías obsoletas):

MainWindow.java
Código
  1. package com.company.app.views;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Color;
  5. import java.awt.FlowLayout;
  6. import java.awt.GridBagConstraints;
  7. import java.awt.GridBagLayout;
  8. import java.awt.GridLayout;
  9.  
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JList;
  14. import javax.swing.JMenu;
  15. import javax.swing.JMenuBar;
  16. import javax.swing.JMenuItem;
  17. import javax.swing.JPanel;
  18. import javax.swing.JScrollPane;
  19. import javax.swing.JTextArea;
  20. import javax.swing.UIManager;
  21. import javax.swing.UnsupportedLookAndFeelException;
  22.  
  23. import com.company.app.controllers.MainWindowController;
  24. import com.company.app.model.entities.Population;
  25.  
  26. public class MainWindow extends JFrame {
  27. private static final long serialVersionUID = -2973563217322489640L;
  28. private JMenuItem iOpen;
  29. private JMenuItem iExit;
  30. private JMenuItem iNewProvince;
  31. private JMenuItem iUpdateProvince;
  32. private JMenuItem iNewPopulation;
  33. private JMenuItem iUpdatePopulation;
  34. private JMenuItem iAbout;
  35. private JButton btnUpdatePrediction;
  36. private JButton btnNewProvince;
  37. private JButton btnNewPopulation;
  38. private JList<String> provinceList;
  39. private JList<Population> populationList;
  40. private JLabel lblFooter;
  41. private MainWindowController controller;
  42.  
  43. public MainWindow() {
  44. super();
  45. controller = new MainWindowController(this);
  46. initComponents();
  47. }
  48.  
  49. private void initComponents() {
  50. this.setLayout(new BorderLayout(10,10));
  51.  
  52. JPanel top = new JPanel(new BorderLayout());
  53. top.setLayout(new GridLayout(2,1,0,0));
  54. top.add(addMenuBar());
  55. top.add(addToolbar());
  56. this.add(BorderLayout.NORTH, top);
  57. JPanel center = new JPanel(new BorderLayout(10,10));
  58. center.add(BorderLayout.WEST, addProvincesPanel());
  59. center.add(BorderLayout.CENTER, addPredictionsPanel());
  60. this.add(BorderLayout.CENTER, center);
  61. this.add(BorderLayout.SOUTH, addFooterPanel());
  62.  
  63. this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  64. JFrame.setDefaultLookAndFeelDecorated(true);
  65. this.setTitle("Sistema metereológico");
  66. this.setSize(800,600);
  67. try {
  68. UIManager.setLookAndFeel(
  69.        UIManager.getSystemLookAndFeelClassName());
  70. } catch (ClassNotFoundException e) {
  71. e.printStackTrace();
  72. } catch (InstantiationException e) {
  73. e.printStackTrace();
  74. } catch (IllegalAccessException e) {
  75. e.printStackTrace();
  76. e.printStackTrace();
  77. }
  78.  
  79. }
  80.  
  81. private JMenuBar addMenuBar() {
  82. JMenuBar menubar = new JMenuBar();
  83. menubar.setBackground(new Color(50,50,50));
  84.  
  85. JMenu menuFile = new JMenu("Archivo");
  86. menuFile.setForeground(Color.WHITE);
  87. iOpen = new JMenuItem("Abrir...");
  88. iOpen.addActionListener(controller);
  89. iExit = new JMenuItem("Salir");
  90. iExit.addActionListener(controller);
  91. menuFile.add(iOpen);
  92. menuFile.add(iExit);
  93.  
  94. JMenu menuProvince = new JMenu("Provincias");
  95. menuProvince.setForeground(Color.WHITE);
  96. iNewProvince = new JMenuItem("Nueva provincia");
  97. iNewProvince.addActionListener(controller);
  98. iUpdateProvince = new JMenuItem("Actualizar provincia");
  99. iUpdateProvince.addActionListener(controller);
  100. menuProvince.add(iNewProvince);
  101. menuProvince.add(iUpdateProvince);
  102.  
  103. JMenu menuPopulation = new JMenu("Poblaciones");
  104. menuPopulation.setForeground(Color.WHITE);
  105. iNewPopulation = new JMenuItem("Nueva población");
  106. iNewPopulation.addActionListener(controller);
  107. iUpdatePopulation = new JMenuItem("Actualizar población");
  108. iUpdatePopulation.addActionListener(controller);
  109. menuPopulation.add(iNewPopulation);
  110. menuPopulation.add(iUpdatePopulation);
  111.  
  112. JMenu menuAbout = new JMenu("Ayuda");
  113. menuAbout.setForeground(Color.WHITE);
  114. iAbout = new JMenuItem("Acerca...");
  115. iAbout.addActionListener(controller);
  116. menuAbout.add(iAbout);
  117.  
  118. menubar.add(menuFile);
  119. menubar.add(menuProvince);
  120. menubar.add(menuPopulation);
  121. menubar.add(menuAbout);
  122.  
  123. return menubar;
  124. }
  125.  
  126. private JPanel addToolbar() {
  127. JPanel toolbar = new JPanel(new FlowLayout(FlowLayout.LEFT));
  128. toolbar.setBackground(new Color(0,184,255));
  129. toolbar.setSize(50,100);
  130. btnUpdatePrediction = new JButton("Actualizar predicción");
  131. btnUpdatePrediction.setFocusable(false);
  132. btnUpdatePrediction.addActionListener(controller);
  133. btnNewProvince = new JButton("Nueva provincia");
  134. btnNewProvince.setFocusable(false);
  135. btnNewProvince.addActionListener(controller);
  136. btnNewPopulation = new JButton("Nueva población");
  137. btnNewPopulation.setFocusable(false);
  138. btnNewPopulation.addActionListener(controller);
  139.  
  140. toolbar.add(btnUpdatePrediction);
  141. toolbar.add(btnNewProvince);
  142. toolbar.add(btnNewPopulation);
  143.  
  144. return toolbar;
  145. }
  146.  
  147. private JPanel addProvincesPanel() {
  148. JPanel panel = new JPanel(new GridBagLayout());
  149.  
  150. provinceList = new JList<>();
  151. populationList = new JList<>();
  152.  
  153. constraints.gridx = 0;
  154. constraints.gridy = 0;
  155. constraints.gridwidth = 1;
  156. constraints.gridheight = 1;
  157. panel.add(new JLabel("Provincias"), constraints);
  158.  
  159. constraints = new GridBagConstraints();
  160. constraints.gridx = 0;
  161. constraints.gridy = 1;
  162. constraints.gridwidth = 2;
  163. constraints.gridheight = 1;
  164. constraints.weighty = 1.0;
  165. constraints.fill = GridBagConstraints.BOTH;
  166. panel.add(new JScrollPane(provinceList), constraints);
  167.  
  168.  
  169. constraints = new GridBagConstraints();
  170. constraints.gridx = 0;
  171. constraints.gridy = 2;
  172. constraints.gridwidth = 1;
  173. constraints.gridheight = 1;
  174. panel.add(new JLabel("Poblaciones"), constraints);
  175.  
  176. constraints = new GridBagConstraints();
  177. constraints.gridx = 0;
  178. constraints.gridy = 3;
  179. constraints.gridwidth = 2;
  180. constraints.gridheight = 1;
  181. constraints.weighty = 1.0;
  182. constraints.fill = GridBagConstraints.BOTH;
  183. panel.add(new JScrollPane(populationList), constraints);
  184.  
  185. return panel;
  186. }
  187.  
  188. private JPanel addPredictionsPanel() {
  189. JPanel panel = new JPanel(new BorderLayout());
  190. JLabel provinceName = new JLabel("Predicciones para ");
  191. JTextArea textArea = new JTextArea();
  192. textArea.setEditable(false);
  193. panel.add(BorderLayout.NORTH, provinceName);
  194. panel.add(BorderLayout.CENTER, new JScrollPane(textArea));
  195.  
  196. return panel;
  197. }
  198.  
  199. private JPanel addFooterPanel() {
  200. JPanel panel = new JPanel();
  201. panel.setBackground(new Color(80,80,80));
  202. lblFooter = new JLabel("Sistema metereológico");
  203. lblFooter.setForeground(new Color(200,200,200));
  204. panel.add(lblFooter);
  205.  
  206. return panel;
  207. }
  208.  
  209. }

MainWindowController.java

Código
  1. package com.company.app.controllers;
  2.  
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5.  
  6. import com.company.app.views.MainWindow;
  7. import com.company.app.views.NewProvinceDialog;
  8.  
  9. public class MainWindowController implements ActionListener {
  10. private MainWindow gui;
  11.  
  12. public MainWindowController(MainWindow gui) {
  13. this.gui = gui;
  14. }
  15.  
  16. @Override
  17. public void actionPerformed(ActionEvent e) {
  18. if(e.getActionCommand().equals("Nueva provincia")) {
  19. NewProvinceDialog dialog = new NewProvinceDialog(gui);
  20. dialog.setVisible(true);
  21. }
  22. }
  23.  
  24. }

NewProvinceDialog.java

Código
  1. package com.company.app.views;
  2.  
  3. import java.awt.GridBagConstraints;
  4. import java.awt.GridBagLayout;
  5.  
  6. import javax.swing.JButton;
  7. import javax.swing.JDialog;
  8. import javax.swing.JFrame;
  9. import javax.swing.JLabel;
  10. import javax.swing.JPanel;
  11. import javax.swing.JTextField;
  12.  
  13. public class NewProvinceDialog extends JDialog {
  14. private static final long serialVersionUID = -3369879094143739366L;
  15. private JTextField txtProvince;
  16. private JButton btnAddProvince;
  17.  
  18. public NewProvinceDialog(JFrame parent) {
  19. super(parent);
  20. initComponents(parent);
  21. }
  22.  
  23. private void initComponents(JFrame parent) {
  24. JPanel panel = new JPanel(new GridBagLayout());
  25. JLabel label = new JLabel("Nombre de la provincia:");
  26. txtProvince = new JTextField();
  27. btnAddProvince = new JButton("Agregar");
  28.  
  29. constraints.gridx = 0;
  30. constraints.gridy = 0;
  31. constraints.gridwidth = 1;
  32. constraints.gridheight = 1;
  33. constraints.weighty = 1.0;
  34. panel.add(label, constraints);
  35.  
  36. constraints = new GridBagConstraints();
  37. constraints.gridx = 1;
  38. constraints.gridy = 0;
  39. constraints.gridwidth = 3;
  40. constraints.gridheight = 1;
  41. constraints.weightx = 1.0;
  42. constraints.fill = GridBagConstraints.HORIZONTAL;
  43. panel.add(txtProvince, constraints);
  44.  
  45. constraints = new GridBagConstraints();
  46. constraints.gridx = 3;
  47. constraints.gridy = 1;
  48. constraints.gridwidth = 1;
  49. constraints.gridheight = 1;
  50. constraints.anchor = GridBagConstraints.EAST;
  51. panel.add(btnAddProvince, constraints);
  52.  
  53. this.add(panel);
  54. this.setTitle("Agregar nueva provincia");
  55. this.setSize(280,100);
  56. this.setModal(true);
  57. this.setLocationRelativeTo(parent);
  58. this.setResizable(false);
  59.  
  60. }
  61.  
  62. }

Imágenes:

(http://i.imgur.com/qTmH2VD.png)

(http://i.imgur.com/Pgd6jlm.png)

Sólo es cosa de jugar con los layouts y delegar responsabilidades correctamente. Cualquier duda, comentas.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 16 Marzo 2015, 18:10 pm
esta practica la tenemos que hacer en awt para familiarizarnos y la siguiente es pasar esta a swing, voy a mirar ahora lo que me has puesto ya que lo he mirado por encima y me ha resuelto varias dudas, muchas gracias :)


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 16 Marzo 2015, 18:15 pm
una cosa, yo en mi constructor creo todo el frame con todos los botones, por que tu solo pones esto:
Código
  1. public MainWindow() {
  2. super();
  3. controller = new MainWindowController(this);
  4. initComponents();
  5. }


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 16 Marzo 2015, 18:40 pm
Buenas tardes,

La razón de ello es porque estoy usando el patrón MVC como ya dije en mi respuesta anterior. El patrón MVC consiste en dividir tu aplicación en 3 capas:

  • Modelo: Aquí estará toda la lógica de tu aplicación. Entidades y todo tipo de objetos que colaboran entre sí para cumplir con las reglas del negocio.
  • Vista: Esta capa solo contiene las vistas (sean HTML, Frame, JFrame, Stage de JavaFX, WinForms, etc).
  • Controlador: Esta capa es la que está entre la Vista y el Modelo. El controlador detecta la acción que ha elegido el usuario y de acuerdo a ello se dirige al modelo para realizar el proceso demandado o también puede acceder a la Vista para devolver una nueva vista. Por ejemplo, cuando registras algo y se muestra una ventana para los datos.


Una vez entendidos éstos conceptos podrás entender el código que te he puesto. De todas maneras, te explicaré cómo funciona.

MainWindowController

Esta es una clase que actúa como controlador, en concreto, es controlador de la vista MainWindow (JFrame). Como se puede observar en su constructor, recibe como parámetro una instancia de MainWindow para que pueda manejar a ella.

Código
  1. public MainWindowController(MainWindow gui) {
  2.    this.gui = gui;
  3. }

Al recibir éste controlador una referencia de la vista MainWindow, la puede manejar desde aquí y ya no tenemos que mezclar la lógica de negocio con las vistas. Esto es sumamente importante en el desarrollo de software. El software debe ser fácil de mantener, por que el software una vez que se termina no es todo, siempre se seguirá manteniendo, actualizando, corrigiendo bugs, etc.

La referencia se la pasamos desde la vista MainWindow con el uso de this. this es una palabra reservada que hace referencia a "la clase donde se encuentra", por lo que, al pasarle al hacer:

Código
  1. new MainWindowController(this);

Lo que hacemos es pasarle la referencia de esa clase, MainWindow, a MainWindowController. De ésta manera, desacoplamos la aplicación, haciéndola mucho más modular y fácil de entender y mantener.

Es importante aclarar que para acceder a los controles de la vista (botones, tablas, etc), vas a tener que:

  • Hacer todos los controles public (mala idea).
  • Hacer getters/setters para los controles.

La decisión para dejar los controles private y hacer los getters/setters para acceder a ellos es un concepto de Programación orientada a objetos, y se llama Encapsulamiento, que consiste en aislar las propiedades de un objeto para el exterior, con el propósito de protegerlas y ocultarlas al resto de objetos. sobre esto, ya entenderás más adelante (aunque ya deberías si ya estás por aplicaciones gráficas).


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 16 Marzo 2015, 19:17 pm
tienes que crear una clase nueva para cada evento o los puedes poner como clases propias?


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 16 Marzo 2015, 19:33 pm
¿Una clase para cada evento?. Una clase puede implementar un número ilimitado de interfaces, por lo que tus controladores, por ejemplo el controlador MainWindowController que implementa ActionListener, puede implementar también KeyListener entre otras.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 17 Marzo 2015, 10:06 am
he modificado el codigo para hacerlo por modulos:


interfaz principal
Código
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.util.Date;
  5. import java.text.SimpleDateFormat;
  6.  
  7. import paa.provincias.GestorAEMET;
  8. import paa.provincias.GestorAEMETException;
  9.  
  10. /**
  11.  * Fichero: InterfazAWT_AEMET.java
  12.  * Clase que implementa la Interfaz Gráfica AEMET con awt.
  13.  * @author  PAA
  14.  * @version 1.0
  15.  */
  16. public class InterfazAWT_AEMET extends Frame {
  17. /**
  18. *
  19. */
  20. private static final long serialVersionUID = 502635761186556414L;
  21.  
  22. private static final String FICHERO = "almacen.dat";
  23.  
  24.  
  25. // private IAlmacenPoblaciones almacenPoblaciones;
  26. // private List listaPoblaciones;
  27. // private List listaPredicciones;
  28.  
  29. /**
  30. * Constructor.
  31. */
  32. public InterfazAWT_AEMET(String titulo, int ancho, int alto){
  33. super(titulo);
  34. setSize(ancho,alto);
  35. setLocationRelativeTo(null);
  36. setLayout( new BorderLayout() ); // Layout de la aplicación, podría ser otro
  37. initComponents();
  38.  
  39. }//Constructor
  40. //List<IPrediccion> lista = null;
  41.  
  42.  
  43. /*try {
  44. lista = gestor.getPredicciones( poblacion );
  45. poblacion.lista = lista;
  46. } catch( GestorAEMETException gae ) {
  47. System.out.println( gae.getMessage() );
  48. }*/
  49.  
  50. private void initComponents(){
  51.  
  52. // Recuperamos el almacén
  53. AlmacenPoblaciones almacenPoblaciones = new AlmacenPoblaciones();
  54. if (almacenPoblaciones.recuperar(FICHERO))
  55. System.out.println("Recuperado el almacen del fichero " + FICHERO);
  56. else
  57. System.out.println("No se pudo recuperar el almacen del fichero " + FICHERO);
  58. //Boton salir por defecto
  59. addWindowListener (new WindowAdapter () {
  60.          public void windowClosing(WindowEvent e) {
  61.          guardarAntesDeSalir ();
  62.              System.exit(0);
  63.             }
  64.    });
  65.  
  66. setMenuBar(addMenuBar());
  67. this.add (addToolBar(),BorderLayout.NORTH);
  68. this.add (addlineaEstado(), BorderLayout.SOUTH);
  69. this.add (addPanelIzquierda(), BorderLayout.WEST);
  70. this.add (addpredicciones(), BorderLayout.CENTER);
  71. }
  72.  
  73.  
  74. private MenuBar addMenuBar(){
  75. //Sitúo los menús desplegables
  76. MenuBar barraDeMenu = new MenuBar();
  77.  
  78. // Creo el menú Archivo
  79. Menu menuArchivo = new Menu("Archivo");
  80. MenuItem crearGuardar = new MenuItem ("Guardar");
  81. MenuItem crearCargar = new MenuItem ("Cargar");
  82. MenuItem salir = new MenuItem ("Salir");
  83. crearCargar.addActionListener(new CargarArchivo());
  84. crearGuardar.addActionListener(new GuardarArchivo());
  85. salir.addActionListener(new Salir());
  86. menuArchivo.add(crearCargar);
  87. menuArchivo.add(crearGuardar);
  88. menuArchivo.add(salir);
  89.  
  90. // Creo el menú Provincias
  91. Menu menuProvincias = new Menu("Provincias");
  92. MenuItem crearProvincias = new MenuItem ("Crear provincia");
  93. MenuItem borrarProvincias = new MenuItem ("Borrar provincia");
  94. crearProvincias.addActionListener(new CrearProvincia());
  95. borrarProvincias.addActionListener(new BorrarProvincia());
  96. menuProvincias.add(crearProvincias);
  97. menuProvincias.add(borrarProvincias);
  98.  
  99. // Creo el menu Poblaciones
  100. Menu menuPoblaciones = new Menu("Poblaciones");
  101. MenuItem crearPoblacion = new MenuItem ("Crear poblacion");
  102. MenuItem borrarPoblacion = new MenuItem ("Borrar poblacion");
  103. MenuItem ordenarNombre = new MenuItem ("Ordenar por nombre");
  104. MenuItem ordenarHabitantes = new MenuItem ("Ordenar por habitantes");
  105. MenuItem modPoblacion = new MenuItem ("Modificar poblacion");
  106. MenuItem movPoblacion = new MenuItem ("Mover poblacion");
  107. crearPoblacion.addActionListener(new CrearPoblacion());
  108. borrarPoblacion.addActionListener(new BorrarPoblacion());
  109. ordenarNombre.addActionListener(new OrdenarNombre());
  110. ordenarHabitantes.addActionListener(new OrdenarHabitantes());
  111. modPoblacion.addActionListener(new ModPoblacion());
  112. movPoblacion.addActionListener(new MovPoblacion());
  113. menuPoblaciones.add(crearPoblacion);
  114. menuPoblaciones.add(borrarPoblacion);
  115. menuPoblaciones.add(ordenarNombre);
  116. menuPoblaciones.add(ordenarHabitantes);
  117. menuPoblaciones.add(modPoblacion);
  118. menuPoblaciones.add(movPoblacion);
  119.  
  120. // Creo el menú de ayuda
  121. Menu ayuda = new Menu("Ayuda");
  122. MenuItem acercaDe = new MenuItem("Acerca de");
  123. acercaDe.addActionListener(new AcercaDe());
  124. ayuda.add(acercaDe);
  125.  
  126. //Crea el
  127. barraDeMenu.add(menuArchivo);
  128. barraDeMenu.add(menuProvincias);
  129. barraDeMenu.add(menuPoblaciones);
  130. // Sitúo el menú de ayuda en su sitio
  131. barraDeMenu.setHelpMenu(ayuda);
  132. return barraDeMenu;
  133. }
  134.  
  135. private Panel addToolBar(){
  136. //Sitúo la línea de botones
  137. Panel lineaDeBotones = new Panel(new FlowLayout (FlowLayout.LEFT));
  138. lineaDeBotones.setBackground (Color.lightGray);
  139.  
  140. //Boton crear provincia
  141. Button proCrear = new Button("Crear provincia");
  142. proCrear.addActionListener(new CrearProvincia());
  143.  
  144. //Boton crear poblacion
  145. Button poCrear = new Button("Crear Población");
  146. poCrear.addActionListener(new CrearPoblacion());
  147.  
  148. //Boton actualizar prediccion
  149. Button aPrediccion = new Button("Actualizar Predicción");
  150. aPrediccion.addActionListener(new ActualizarPrediccion());
  151.  
  152. // Añadir los botones a la barra
  153. lineaDeBotones.add(proCrear);
  154. lineaDeBotones.add(poCrear);
  155. lineaDeBotones.add(aPrediccion);
  156. return lineaDeBotones;
  157. }
  158.  
  159. private Panel addPanelIzquierda(){
  160. //Creamos  panel para mostrar provincias y poblaciones y lo colocamos a la izquierda
  161. Panel izquierda = new Panel(new GridLayout(4,1));
  162.  
  163. Label lProvincia = new Label("Provincias:");
  164. List tProvincias = new List();
  165.  
  166. Label lPoblacion = new Label("Poblaciones:");
  167. List tPoblaciones = new List();
  168.  
  169. izquierda.add(lProvincia);
  170. izquierda.add(tProvincias);
  171. izquierda.add(lPoblacion);
  172. izquierda.add(tPoblaciones);
  173. return izquierda;
  174. }
  175.  
  176. private Panel addpredicciones(){
  177. //Creamos el panel de las predicciones
  178. Panel predicciones = new Panel(new BorderLayout());
  179. Label lPrediccion = new Label("Predicciones de :");
  180. List tPrediccion = new List();
  181. predicciones.add(lPrediccion,BorderLayout.NORTH);
  182. predicciones.add(tPrediccion,BorderLayout.CENTER);
  183. return predicciones;
  184. }
  185.  
  186. private Panel addlineaEstado(){
  187. //Sitúo la línea de estado
  188. Panel lineaDeEstado = new Panel();
  189. lineaDeEstado.setLayout (new FlowLayout (FlowLayout.LEFT));
  190. lineaDeEstado.setBackground (Color.lightGray);
  191. Label ventanaDeeventos = new Label("Gestor AEMET v1.0 (PAA)");
  192. lineaDeEstado.add (ventanaDeeventos);
  193. return lineaDeEstado;
  194. }
  195.  
  196. private void guardarAntesDeSalir () {
  197.  
  198. // Guardar almacen
  199. System.out.println ("Gracias por utilizar nuestro programa");
  200. }
  201.  
  202.  
  203. /**
  204. * Clase que implementa la acción del menú "acerca de".
  205. */
  206. class AcercaDe implements ActionListener{  // Clase interna
  207. public void actionPerformed(ActionEvent e){
  208. VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe(InterfazAWT_AEMET.this);
  209. ventanaAcercaDe.setVisible(true);
  210. }
  211. }//Acerca de
  212.  
  213.  
  214. //****Acciones menu archivo****
  215. class GuardarArchivo implements ActionListener {
  216. public void actionPerformed(ActionEvent e) {
  217.  
  218. }
  219. }//Guardar en un fichero
  220.  
  221. class CargarArchivo implements ActionListener {
  222. public void actionPerformed(ActionEvent e) {
  223.  
  224. }
  225. }//Cargar desde un archivo
  226.  
  227. class Salir implements ActionListener {
  228. public void actionPerformed(ActionEvent e) {
  229.  
  230. }
  231. }//Salir de la aplicacion
  232.  
  233.  
  234. //****Acciones menu provincia****
  235. // Crea una provincia
  236. class CrearProvincia implements ActionListener {
  237.  public void actionPerformed(ActionEvent e) {
  238. e.getActionCommand();
  239.  
  240. }
  241. }
  242.  
  243. class VentanaCrearProvincia implements ActionListener {
  244. public void actionPerformed(ActionEvent e) {
  245. VentanaCrearProvincia dialog = new VentanaCrearProvincia();
  246. dialog.setVisible(true);
  247. }
  248.  
  249. }
  250.  
  251. //Elimina una provincia
  252. class BorrarProvincia implements ActionListener {
  253. public void actionPerformed(ActionEvent e) {
  254. Aviso aviso = new Aviso(InterfazAWT_AEMET.this,"Provincia:");
  255. aviso.setLayout(new GridLayout(2,2,0,0));
  256. aviso.setTitle("Eliminar Provincia");
  257. aviso.setSize(300, 100);
  258. TextField textField = new TextField();
  259. Button eliminar = new Button("Eliminar");
  260. Button cancelar = new Button("Cancelar");
  261. aviso.add(textField);
  262. aviso.add(eliminar);
  263. aviso.add(cancelar);
  264.  
  265. aviso.setVisible(true);
  266.  
  267.  
  268. }
  269. }
  270.  
  271.  
  272.  
  273.  
  274. //****Acciones menu poblacion****
  275. //Crear una poblacion
  276. class CrearPoblacion implements ActionListener {
  277. public void actionPerformed(ActionEvent e) {
  278. //Aviso aviso = new Aviso(InterfazAWT_AEMET.this,"Nueva provincia");
  279. Aviso dialog = new Aviso(InterfazAWT_AEMET.this);
  280. dialog.setLayout(new BorderLayout());
  281. dialog.setSize(300, 400);
  282. Panel texto = new Panel(new GridLayout(4,1,0,0));
  283. Panel panel = new Panel(new FlowLayout());
  284. Button crear = new Button("Crear");
  285. Button cancelar = new Button("Cancelar");
  286. TextField nombre = new TextField("Nombre");
  287. Label nombreP = new Label("Nombre Provincia");
  288. TextField habitantes = new TextField("Habitantes");
  289. TextField codigo = new TextField("CodigoAEMET");
  290.  
  291. texto.add(nombre);
  292. texto.add(nombreP);
  293. texto.add(habitantes);
  294. texto.add(codigo);
  295. panel.add(crear);
  296. panel.add(cancelar);
  297.  
  298. dialog.add(texto, BorderLayout.CENTER);
  299. dialog.add(panel,BorderLayout.SOUTH);
  300. dialog.pack();
  301. dialog.setVisible(true);
  302.  
  303.  
  304.  
  305. }
  306.  
  307. }
  308.  
  309. //Eliminar una poblacion
  310. class BorrarPoblacion implements ActionListener {
  311. public void actionPerformed(ActionEvent e) {
  312. Aviso aviso = new Aviso(InterfazAWT_AEMET.this,"Poblacion:");
  313. aviso.setLayout(new GridLayout(2,2,0,0));
  314. aviso.setTitle("Eliminar Poblacion");
  315. aviso.setSize(300, 100);
  316. TextField textField = new TextField();
  317. Button eliminar = new Button("Eliminar");
  318. Button cancelar = new Button("Cancelar");
  319. aviso.add(textField);
  320. aviso.add(eliminar);
  321. aviso.add(cancelar);
  322.  
  323. aviso.setVisible(true);
  324. }
  325. }
  326.  
  327. //Ordena por nombre las poblaciones
  328. class OrdenarNombre implements ActionListener {
  329. public void actionPerformed(ActionEvent e) {
  330.  
  331. }
  332. }
  333.  
  334. //Ordena por numero de habitantes las poblaciones
  335. class OrdenarHabitantes implements ActionListener {
  336. public void actionPerformed(ActionEvent e) {
  337.  
  338. }
  339. }
  340.  
  341. //Modifica los valores de una poblacion
  342. class ModPoblacion implements ActionListener {
  343. public void actionPerformed(ActionEvent e) {
  344.  
  345. }
  346. }
  347.  
  348. //Mueve una poblacion de provincia
  349. class MovPoblacion implements ActionListener {
  350. public void actionPerformed(ActionEvent e) {
  351.  
  352. }
  353. }
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361. //Accion actualizar prediccion
  362. class ActualizarPrediccion implements ActionListener {
  363. public void actionPerformed(ActionEvent e) {
  364.  
  365. }
  366. }
  367.  
  368. /**
  369. * Método main.
  370. */
  371. public static void main(String[] args) {
  372.  
  373. InterfazAWT_AEMET mimarco = new InterfazAWT_AEMET("Gestor AEMET",1000,500);
  374. mimarco.setVisible(true);
  375. } // Main
  376. }
  377.  


ventana crear provincia
Código
  1. import java.awt.Button;
  2. import java.awt.Dialog;
  3. import java.awt.Frame;
  4. import java.awt.GridLayout;
  5. import java.awt.TextField;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.awt.event.WindowAdapter;
  9. import java.awt.event.WindowEvent;
  10.  
  11.  
  12. public class VentanaCrearProvincia extends Dialog {
  13.  
  14. /**
  15. *
  16. */
  17. private static final long serialVersionUID = -2530069431684593677L;
  18. public VentanaCrearProvincia(Frame f) {
  19. super(f,"Nueva provincia",true);
  20. setLocationRelativeTo(f);
  21.  
  22. this.setLayout(new GridLayout(2,2,0,0));
  23. this.setTitle("Crear Provincia");
  24. this.setSize(300, 100);
  25. TextField textField = new TextField();
  26. Button crear = new Button("Crear");
  27. Button cancelar = new Button("Cancelar");
  28. crear.addActionListener(new BotonCrear());
  29. cancelar.addActionListener(new BotonCancelar());
  30. this.add(textField);
  31. this.add(crear);
  32. this.add(cancelar);
  33.  
  34. addWindowListener (new WindowAdapter (){
  35.          public void windowClosing(WindowEvent e) {
  36.          VentanaCrearProvincia.this.dispose();
  37.             }
  38.          });
  39. }
  40.  
  41. class BotonCrear implements ActionListener{
  42.  
  43. @Override
  44. public void actionPerformed(ActionEvent e) {
  45. // TODO Auto-generated method stub
  46.  
  47. }
  48.  
  49. }
  50.  
  51. class BotonCancelar implements ActionListener{
  52.  
  53. @Override
  54. public void actionPerformed(ActionEvent e) {
  55. System.exit(0);
  56.  
  57. }
  58.  
  59. }
  60.  
  61. }
  62.  

pero tengo varios errores en el metodo initcomponents:

Código
  1. java.io.FileNotFoundException: almacen.dat (El sistema no puede encontrar el archivo especificado)
  2. at java.io.FileInputStream.open(Native Method)
  3. at java.io.FileInputStream.<init>(Unknown Source)
  4. at java.io.FileInputStream.<init>(Unknown Source)
  5. at AlmacenPoblaciones.recuperar(AlmacenPoblaciones.java:357)
  6. at InterfazAWT_AEMET.initComponents(InterfazAWT_AEMET.java:54)
  7. at InterfazAWT_AEMET.<init>(InterfazAWT_AEMET.java:37)
  8. at InterfazAWT_AEMET.main(InterfazAWT_AEMET.java:373)

lo de que no encuentra el archivo, es por que no lo tengo creado, ese no me preocupa de momento, se abre la ventana principal pero al pulsar en crear provincia no sale la siguiente ventana


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 17 Marzo 2015, 17:31 pm
Me has mal entendido. Eso no es modular, eso es repetitivo y viola el principio KISS (Keep it simple stupid). Ya te di las pautas para que lo hagas correctamente, depende de ti si las usas o no.

Código
  1. class VentanaCrearProvincia implements ActionListener {
  2.  
  3. 244. public void actionPerformed(ActionEvent e) {
  4.  
  5. 245. VentanaCrearProvincia dialog = new VentanaCrearProvincia();
  6.  
  7. 246. dialog.setVisible(true);
  8.  
  9. 247. }
  10.  
  11. 248.
  12.  
  13. 249. }

¿La clase VentanaCrearProvincia no aceptaba un Frame en el constructor para utilizarlo como padre?


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 18 Marzo 2015, 18:24 pm
vale, ya he conseguido que me funcione, mira:

clase principal

Código
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.util.Date;
  5. import java.text.SimpleDateFormat;
  6.  
  7. import paa.provincias.GestorAEMET;
  8. import paa.provincias.GestorAEMETException;
  9.  
  10. /**
  11.  * Fichero: InterfazAWT_AEMET.java
  12.  * Clase que implementa la Interfaz Gráfica AEMET con awt.
  13.  * @author  PAA
  14.  * @version 1.0
  15.  */
  16. public class InterfazAWT_AEMET extends Frame {
  17. /**
  18. *
  19. */
  20. private static final long serialVersionUID = 502635761186556414L;
  21.  
  22. private static final String FICHERO = "almacen.dat";
  23. private VentanaCrearProvinciaController controllerCrearProvincia;
  24.  
  25. // private IAlmacenPoblaciones almacenPoblaciones;
  26. // private List listaPoblaciones;
  27. // private List listaPredicciones;
  28.  
  29. /**
  30. * Constructor.
  31. */
  32. public InterfazAWT_AEMET(String titulo, int ancho, int alto){
  33. super(titulo);
  34. controllerCrearProvincia = new VentanaCrearProvinciaController(this);
  35. setSize(ancho,alto);
  36. setLocationRelativeTo(null);
  37. setLayout( new BorderLayout() ); // Layout de la aplicación, podría ser otro
  38. initComponents();
  39.  
  40. }//Constructor
  41. //List<IPrediccion> lista = null;
  42.  
  43.  
  44. /*try {
  45. lista = gestor.getPredicciones( poblacion );
  46. poblacion.lista = lista;
  47. } catch( GestorAEMETException gae ) {
  48. System.out.println( gae.getMessage() );
  49. }*/
  50.  
  51. private void initComponents(){
  52.  
  53. // Recuperamos el almacén
  54. AlmacenPoblaciones almacenPoblaciones = new AlmacenPoblaciones();
  55. if (almacenPoblaciones.recuperar(FICHERO))
  56. System.out.println("Recuperado el almacen del fichero " + FICHERO);
  57. else
  58. System.out.println("No se pudo recuperar el almacen del fichero " + FICHERO);
  59. //Boton salir por defecto
  60. addWindowListener (new WindowAdapter () {
  61.          public void windowClosing(WindowEvent e) {
  62.          guardarAntesDeSalir ();
  63.              System.exit(0);
  64.             }
  65.    });
  66.  
  67. setMenuBar(addMenuBar());
  68. this.add (addToolBar(),BorderLayout.NORTH);
  69. this.add (addlineaEstado(), BorderLayout.SOUTH);
  70. this.add (addPanelIzquierda(), BorderLayout.WEST);
  71. this.add (addpredicciones(), BorderLayout.CENTER);
  72. }
  73.  
  74.  
  75. private MenuBar addMenuBar(){
  76. //Sitúo los menús desplegables
  77. MenuBar barraDeMenu = new MenuBar();
  78.  
  79. // Creo el menú Archivo
  80. Menu menuArchivo = new Menu("Archivo");
  81. MenuItem crearGuardar = new MenuItem ("Guardar");
  82. MenuItem crearCargar = new MenuItem ("Cargar");
  83. MenuItem salir = new MenuItem ("Salir");
  84. crearCargar.addActionListener(new CargarArchivo());
  85. crearGuardar.addActionListener(new GuardarArchivo());
  86. salir.addActionListener(new Salir());
  87. menuArchivo.add(crearCargar);
  88. menuArchivo.add(crearGuardar);
  89. menuArchivo.add(salir);
  90.  
  91. // Creo el menú Provincias
  92. Menu menuProvincias = new Menu("Provincias");
  93. MenuItem crearProvincias = new MenuItem ("Crear provincia");
  94. MenuItem borrarProvincias = new MenuItem ("Borrar provincia");
  95. crearProvincias.addActionListener(controllerCrearProvincia);
  96. borrarProvincias.addActionListener(new BorrarProvincia());
  97. menuProvincias.add(crearProvincias);
  98. menuProvincias.add(borrarProvincias);
  99.  
  100. // Creo el menu Poblaciones
  101. Menu menuPoblaciones = new Menu("Poblaciones");
  102. MenuItem crearPoblacion = new MenuItem ("Crear poblacion");
  103. MenuItem borrarPoblacion = new MenuItem ("Borrar poblacion");
  104. MenuItem ordenarNombre = new MenuItem ("Ordenar por nombre");
  105. MenuItem ordenarHabitantes = new MenuItem ("Ordenar por habitantes");
  106. MenuItem modPoblacion = new MenuItem ("Modificar poblacion");
  107. MenuItem movPoblacion = new MenuItem ("Mover poblacion");
  108. crearPoblacion.addActionListener(new CrearPoblacion());
  109. borrarPoblacion.addActionListener(new BorrarPoblacion());
  110. ordenarNombre.addActionListener(new OrdenarNombre());
  111. ordenarHabitantes.addActionListener(new OrdenarHabitantes());
  112. modPoblacion.addActionListener(new ModPoblacion());
  113. movPoblacion.addActionListener(new MovPoblacion());
  114. menuPoblaciones.add(crearPoblacion);
  115. menuPoblaciones.add(borrarPoblacion);
  116. menuPoblaciones.add(ordenarNombre);
  117. menuPoblaciones.add(ordenarHabitantes);
  118. menuPoblaciones.add(modPoblacion);
  119. menuPoblaciones.add(movPoblacion);
  120.  
  121. // Creo el menú de ayuda
  122. Menu ayuda = new Menu("Ayuda");
  123. MenuItem acercaDe = new MenuItem("Acerca de");
  124. acercaDe.addActionListener(new AcercaDe());
  125. ayuda.add(acercaDe);
  126.  
  127. //Crea el
  128. barraDeMenu.add(menuArchivo);
  129. barraDeMenu.add(menuProvincias);
  130. barraDeMenu.add(menuPoblaciones);
  131. // Sitúo el menú de ayuda en su sitio
  132. barraDeMenu.setHelpMenu(ayuda);
  133. return barraDeMenu;
  134. }
  135.  
  136. private Panel addToolBar(){
  137. //Sitúo la línea de botones
  138. Panel lineaDeBotones = new Panel(new FlowLayout (FlowLayout.LEFT));
  139. lineaDeBotones.setBackground (Color.lightGray);
  140.  
  141. //Boton crear provincia
  142. Button proCrear = new Button("Crear provincia");
  143. proCrear.addActionListener(controllerCrearProvincia);
  144.  
  145. //Boton crear poblacion
  146. Button poCrear = new Button("Crear Población");
  147. poCrear.addActionListener(new CrearPoblacion());
  148.  
  149. //Boton actualizar prediccion
  150. Button aPrediccion = new Button("Actualizar Predicción");
  151. aPrediccion.addActionListener(new ActualizarPrediccion());
  152.  
  153. // Añadir los botones a la barra
  154. lineaDeBotones.add(proCrear);
  155. lineaDeBotones.add(poCrear);
  156. lineaDeBotones.add(aPrediccion);
  157. return lineaDeBotones;
  158. }
  159.  
  160. private Panel addPanelIzquierda(){
  161. //Creamos  panel para mostrar provincias y poblaciones y lo colocamos a la izquierda
  162. Panel izquierda = new Panel(new GridLayout(4,1));
  163.  
  164. Label lProvincia = new Label("Provincias:");
  165. List tProvincias = new List();
  166.  
  167. Label lPoblacion = new Label("Poblaciones:");
  168. List tPoblaciones = new List();
  169.  
  170. izquierda.add(lProvincia);
  171. izquierda.add(tProvincias);
  172. izquierda.add(lPoblacion);
  173. izquierda.add(tPoblaciones);
  174. return izquierda;
  175. }
  176.  
  177. private Panel addpredicciones(){
  178. //Creamos el panel de las predicciones
  179. Panel predicciones = new Panel(new BorderLayout());
  180. Label lPrediccion = new Label("Predicciones de :");
  181. List tPrediccion = new List();
  182. predicciones.add(lPrediccion,BorderLayout.NORTH);
  183. predicciones.add(tPrediccion,BorderLayout.CENTER);
  184. return predicciones;
  185. }
  186.  
  187. private Panel addlineaEstado(){
  188. //Sitúo la línea de estado
  189. Panel lineaDeEstado = new Panel();
  190. lineaDeEstado.setLayout (new FlowLayout (FlowLayout.LEFT));
  191. lineaDeEstado.setBackground (Color.lightGray);
  192. Label ventanaDeeventos = new Label("Gestor AEMET v1.0 (PAA)");
  193. lineaDeEstado.add (ventanaDeeventos);
  194. return lineaDeEstado;
  195. }
  196.  
  197. private void guardarAntesDeSalir () {
  198.  
  199. // Guardar almacen
  200. System.out.println ("Gracias por utilizar nuestro programa");
  201. }
  202.  
  203.  
  204. /**
  205. * Clase que implementa la acción del menú "acerca de".
  206. */
  207. class AcercaDe implements ActionListener{  // Clase interna
  208. public void actionPerformed(ActionEvent e){
  209. VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe(InterfazAWT_AEMET.this);
  210. ventanaAcercaDe.setVisible(true);
  211. }
  212. }//Acerca de
  213.  
  214.  
  215. //****Acciones menu archivo****
  216. class GuardarArchivo implements ActionListener {
  217. public void actionPerformed(ActionEvent e) {
  218.  
  219. }
  220. }//Guardar en un fichero
  221.  
  222. class CargarArchivo implements ActionListener {
  223. public void actionPerformed(ActionEvent e) {
  224.  
  225. }
  226. }//Cargar desde un archivo
  227.  
  228. class Salir implements ActionListener {
  229. public void actionPerformed(ActionEvent e) {
  230.  
  231. }
  232. }//Salir de la aplicacion
  233.  
  234.  
  235. //****Acciones menu provincia****
  236. // Crea una provincia
  237. class CrearProvincia implements ActionListener {
  238.  public void actionPerformed(ActionEvent e) {
  239. e.getActionCommand();
  240.  
  241. }
  242. }
  243.  
  244.  
  245.  
  246. //Elimina una provincia
  247. class BorrarProvincia implements ActionListener {
  248. public void actionPerformed(ActionEvent e) {
  249. Aviso aviso = new Aviso(InterfazAWT_AEMET.this,"Provincia:");
  250. aviso.setLayout(new GridLayout(2,2,0,0));
  251. aviso.setTitle("Eliminar Provincia");
  252. aviso.setSize(300, 100);
  253. TextField textField = new TextField();
  254. Button eliminar = new Button("Eliminar");
  255. Button cancelar = new Button("Cancelar");
  256. aviso.add(textField);
  257. aviso.add(eliminar);
  258. aviso.add(cancelar);
  259.  
  260. aviso.setVisible(true);
  261.  
  262.  
  263. }
  264. }
  265.  
  266.  
  267.  
  268.  
  269. //****Acciones menu poblacion****
  270. //Crear una poblacion
  271. class CrearPoblacion implements ActionListener {
  272. public void actionPerformed(ActionEvent e) {
  273. //Aviso aviso = new Aviso(InterfazAWT_AEMET.this,"Nueva provincia");
  274. Aviso dialog = new Aviso(InterfazAWT_AEMET.this);
  275. dialog.setLayout(new BorderLayout());
  276. dialog.setSize(300, 400);
  277. Panel texto = new Panel(new GridLayout(4,1,0,0));
  278. Panel panel = new Panel(new FlowLayout());
  279. Button crear = new Button("Crear");
  280. Button cancelar = new Button("Cancelar");
  281. TextField nombre = new TextField("Nombre");
  282. Label nombreP = new Label("Nombre Provincia");
  283. TextField habitantes = new TextField("Habitantes");
  284. TextField codigo = new TextField("CodigoAEMET");
  285.  
  286. texto.add(nombre);
  287. texto.add(nombreP);
  288. texto.add(habitantes);
  289. texto.add(codigo);
  290. panel.add(crear);
  291. panel.add(cancelar);
  292.  
  293. dialog.add(texto, BorderLayout.CENTER);
  294. dialog.add(panel,BorderLayout.SOUTH);
  295. dialog.pack();
  296. dialog.setVisible(true);
  297.  
  298.  
  299.  
  300. }
  301.  
  302. }
  303.  
  304. //Eliminar una poblacion
  305. class BorrarPoblacion implements ActionListener {
  306. public void actionPerformed(ActionEvent e) {
  307. Aviso aviso = new Aviso(InterfazAWT_AEMET.this,"Poblacion:");
  308. aviso.setLayout(new GridLayout(2,2,0,0));
  309. aviso.setTitle("Eliminar Poblacion");
  310. aviso.setSize(300, 100);
  311. TextField textField = new TextField();
  312. Button eliminar = new Button("Eliminar");
  313. Button cancelar = new Button("Cancelar");
  314. aviso.add(textField);
  315. aviso.add(eliminar);
  316. aviso.add(cancelar);
  317.  
  318. aviso.setVisible(true);
  319. }
  320. }
  321.  
  322. //Ordena por nombre las poblaciones
  323. class OrdenarNombre implements ActionListener {
  324. public void actionPerformed(ActionEvent e) {
  325.  
  326. }
  327. }
  328.  
  329. //Ordena por numero de habitantes las poblaciones
  330. class OrdenarHabitantes implements ActionListener {
  331. public void actionPerformed(ActionEvent e) {
  332.  
  333. }
  334. }
  335.  
  336. //Modifica los valores de una poblacion
  337. class ModPoblacion implements ActionListener {
  338. public void actionPerformed(ActionEvent e) {
  339.  
  340. }
  341. }
  342.  
  343. //Mueve una poblacion de provincia
  344. class MovPoblacion implements ActionListener {
  345. public void actionPerformed(ActionEvent e) {
  346.  
  347. }
  348. }
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356. //Accion actualizar prediccion
  357. class ActualizarPrediccion implements ActionListener {
  358. public void actionPerformed(ActionEvent e) {
  359.  
  360. }
  361. }
  362.  
  363. /**
  364. * Método main.
  365. */
  366. public static void main(String[] args) {
  367.  
  368. InterfazAWT_AEMET mimarco = new InterfazAWT_AEMET("Gestor AEMET",1000,500);
  369. mimarco.setVisible(true);
  370. } // Main
  371. }
  372.  

clase controller

Código
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3.  
  4.  
  5. public class VentanaCrearProvinciaController implements ActionListener {
  6. private InterfazAWT_AEMET gui;
  7.  
  8. public VentanaCrearProvinciaController(InterfazAWT_AEMET gui) {
  9. this.gui = gui;
  10.  
  11. }
  12.  
  13. @Override
  14. public void actionPerformed(ActionEvent e) {
  15. if(e.getActionCommand().equals("Crear provincia")){
  16. VentanaCrearProvinciaDialog dialog = new VentanaCrearProvinciaDialog(gui);
  17. dialog.setVisible(true);
  18. }
  19.  
  20. }
  21.  
  22. }
  23.  

clase ventana provincia

Código
  1. import java.awt.Button;
  2. import java.awt.Dialog;
  3. import java.awt.Frame;
  4. import java.awt.GridLayout;
  5. import java.awt.Label;
  6. import java.awt.TextField;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.WindowAdapter;
  10. import java.awt.event.WindowEvent;
  11.  
  12.  
  13. public class VentanaCrearProvinciaDialog extends Dialog {
  14.  
  15. /**
  16. *
  17. */
  18.  
  19. private static final long serialVersionUID = -2530069431684593677L;
  20. public VentanaCrearProvinciaDialog(Frame gui) {
  21.  
  22. super(gui);
  23. setLocationRelativeTo(gui);
  24.  
  25. this.setLayout(new GridLayout(2,2,0,0));
  26. this.setTitle("Crear Provincia");
  27. this.setSize(300, 100);
  28. Label label = new Label("Provincia");
  29. TextField textField = new TextField();
  30. Button crear = new Button("Crear");
  31. Button cancelar = new Button("Cancelar");
  32. crear.addActionListener(new BotonCrear());
  33. cancelar.addActionListener(new BotonCancelar());
  34. this.add(label);
  35. this.add(textField);
  36. this.add(crear);
  37. this.add(cancelar);
  38.  
  39. addWindowListener (new WindowAdapter (){
  40.          public void windowClosing(WindowEvent e) {
  41.          VentanaCrearProvinciaDialog.this.dispose();
  42.             }
  43.          });
  44. }
  45.  
  46. class BotonCrear implements ActionListener{
  47.  
  48. public void actionPerformed(ActionEvent e) {
  49. // TODO Auto-generated method stub
  50.  
  51. }
  52.  
  53. }
  54.  
  55. class BotonCancelar implements ActionListener{
  56. public void actionPerformed(ActionEvent e) {
  57. dispose();
  58. }
  59. }
  60.  
  61. }
  62.  

me abre la ventana de crear provincia y el boton cancelar la cierra, ahora tengo que agregar el boton crear, pero tengo una duda, he de pasarle almacenPoblaciones como parametro, pero el que debe de recibir como parametro es el metodo BotonCrear de CrearProvinciaDialog, que a su vez a de recibirlo de crearprovinciaController lo recoge de interfazAemet, por tanto quedaria asi la cosa BotonCrear(se le pasa AlmacenPoblaciones como parametro)--CrearProvinciaDialog--CrearProvinciaController--InterfazAemet, pero no se como hacer todo el recorrido.

Y otra pregunta por que en el codigo de tu clase principal el objeto controller de tipo mainWindowController lo llamas en todos los action listener, ¿por que? incluso en los de poblacion, yo solo lo he puesto en los de provincia. Muchas gracias por ayudarme, me esta siendo de gran ayuda


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 18 Marzo 2015, 21:14 pm
Debes de colocar un getter estático para el Map que contiene las provincias y poblaciones, de tal modo que puedes obtener el Map fácil como:

Código
  1. Map<String, Set<Population>> provinces = ProvinceService.getProvinces();

Otra opción es que ProvincesService en lugar de tener el Map como propiedad, sea el mismo un Map. Esto se logra muy fácilmente extendiendo a alguna implementación de Map:

Código
  1. public class ProvinveService extends LinkedHashMap<String, Set<Population>> {
  2.  
  3.    private static ProvinceService instance = null;
  4.    static { instance = new ProvinceService(); }
  5.  
  6.    private ProvinceService() {}
  7.  
  8.    public static ProvinceService getInstance() { return instance; }
  9.  
  10. }

Olvidemos que Singleton no sea muy recomendado. Aquí te sirve y punto. Recuerda que se usaría LinkedHashMap porque HashMap no respeta orden de inserción, cosa que sería un problema cuando haya que ordenarlo.

Los métodos como ordenar, obtenerPoblacion, etc quedarían igual. La única difefencia es que en lugar de hacer referencia al Map (que estaba como propiedad) hariamos referencia a this, porque ahora se hereda de LinkedHashMap.

Haciendo lo anterior puedes obtener el Map muy facilmente:

Código
  1. ProvinceService provinceService = ProvinceService.getInstance();
  2. provinceService.addProvince("Madrid");
  3. ...

Ademas al hacer uso de un constructor privado evitas que se creen instancias de ProvinceService por lo que te aseguras que solo exista una instancia que será compartida entre todos los objetos.

Citar
Y otra pregunta por que en el codigo de tu clase principal el objeto controller de tipo mainWindowController lo llamas en todos los action listener, ¿por que?

 ActionListener es una interface cuyo propósito es escuchar por eventos de acción (sea Enter o Clic). Al escuchar de forma general por eventos de acción puede escuchar un número ilimitado de controles cuya acción sea compatible (Button, TextField, entre otras). En mi respuesta anterior te indiqué que hacer una clase que inplemente ActionListener para cada botón no tiene ningún sentido.

MainWindowController, que implementa ActionListener escuchará todo control de MainWindow por eventos de acción: btnCreateProvince, btnCreatePopulation, btnUpdatePredictions, y todo control que sea escuchable por ActionListener.

Te preguntarás cómo identificar qué botón se ha clickeado. Bien, el objeto ActionEvent contiene información acerca del origen del desencadenamiento de la acción, origen del cual podemos saber su nombre (etiqueta del control) y de acuerdo al nombre realizar la acción deseada:

Código
  1. String targetLabel = e.getActionCommand();
  2. if(targetLabel.equals("Crear Provincia")) {
  3.    new NewProvinceDialog(gui).setVisible(true);
  4. } else if(targetLabel.equals("Nueva población")) {
  5.    new NewPopulationDialog(gui).setVisible(true);
  6. } else if(targetLabel.equals("Actualizar predicciones

En resumen:

  • El Map que contiene las provincias y poblaciones al ser un objeto único que será usado en distintos contextos debe ser estático o heredar de LinkedHashMap y ser un singleton que pueda obtenerse desde todo contexto.
  • No es necesario usar una clase que implemente a un Listener por cada control a escuchar. Es repetitivo e inútil.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 19 Marzo 2015, 13:13 pm
lo que me has puesto de skleton es algo que no he utilizado nunca, no se como se hace por lo que la solucion tiene que ser otra ya debemos de utilizar cosas que hemos dado previamente. he pensado en esto:
Código
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.util.Date;
  5. import java.util.Iterator;
  6. import java.util.LinkedHashMap;
  7. import java.util.Set;
  8. import java.text.SimpleDateFormat;
  9.  
  10. import paa.provincias.GestorAEMET;
  11. import paa.provincias.GestorAEMETException;
  12. import paa.provincias.IPoblacion;
  13.  
  14. /**
  15.  * Fichero: InterfazAWT_AEMET.java
  16.  * Clase que implementa la Interfaz Gráfica AEMET con awt.
  17.  * @author  PAA
  18.  * @version 1.0
  19.  */
  20. public class InterfazAWT_AEMET extends Frame  {
  21. /**
  22. *
  23. */
  24. private static final long serialVersionUID = 502635761186556414L;
  25.  
  26. private static final String FICHERO = "almacen.dat";
  27. private Controller controller;
  28. private AlmacenPoblaciones almacen;
  29.  
  30. // private IAlmacenPoblaciones almacenPoblaciones;
  31. // private List listaPoblaciones;
  32. // private List listaPredicciones;
  33.  
  34. /**
  35. * Constructor.
  36. * @throws GestorAEMETException
  37. */
  38. public InterfazAWT_AEMET(String titulo, int ancho, int alto) throws GestorAEMETException{
  39. super(titulo);
  40. controller = new Controller(this,true);
  41. setSize(ancho,alto);
  42. setLocationRelativeTo(null);
  43. setLayout( new BorderLayout() ); // Layout de la aplicación, podría ser otro
  44. initComponents();
  45. almacen = RecuperaAlmacenPoblaciones();
  46. }//Constructor
  47. //List<IPrediccion> lista = null;
  48.  
  49.  
  50. /*try {
  51. lista = gestor.getPredicciones( poblacion );
  52. poblacion.lista = lista;
  53. } catch( GestorAEMETException gae ) {
  54. System.out.println( gae.getMessage() );
  55. }*/
  56.  
  57. public AlmacenPoblaciones RecuperaAlmacenPoblaciones() {
  58. // Recuperamos el almacén
  59. AlmacenPoblaciones almacenPoblaciones1 = new AlmacenPoblaciones();
  60.  
  61. if (almacenPoblaciones1.recuperar(FICHERO))
  62. System.out.println("Recuperado el almacen del fichero " + FICHERO);
  63. else
  64.  
  65. System.out.println("No se pudo recuperar el almacen del fichero " + FICHERO);
  66. return almacenPoblaciones1;
  67.  
  68. }
  69. private void initComponents() throws GestorAEMETException{
  70.  
  71.  
  72. //Boton salir por defecto
  73. addWindowListener (new WindowAdapter () {
  74.          public void windowClosing(WindowEvent e) {
  75.          guardarAntesDeSalir ();
  76.              System.exit(0);
  77.             }
  78.    });
  79.  
  80. setMenuBar(addMenuBar());
  81. this.add (addToolBar(),BorderLayout.NORTH);
  82. this.add (addlineaEstado(), BorderLayout.SOUTH);
  83. this.add (addPanelIzquierda(), BorderLayout.WEST);
  84. this.add (addpredicciones(), BorderLayout.CENTER);
  85. }
  86.  
  87. public static class almacenPoblaciones extends LinkedHashMap<String, Set<IPoblacion>>{
  88.  
  89. /**
  90. *
  91. */
  92. private static final long serialVersionUID = 1L;
  93. private static almacenPoblaciones instance = null;
  94. static { instance = new almacenPoblaciones(); }
  95.  
  96. private almacenPoblaciones(){}
  97.  
  98. public static almacenPoblaciones getInstance(){
  99. return instance;
  100. }
  101. }
  102.  
  103. private MenuBar addMenuBar(){
  104. //Sitúo los menús desplegables
  105. MenuBar barraDeMenu = new MenuBar();
  106.  
  107. // Creo el menú Archivo
  108. Menu menuArchivo = new Menu("Archivo");
  109. MenuItem crearGuardar = new MenuItem ("Guardar");
  110. MenuItem crearCargar = new MenuItem ("Cargar");
  111. MenuItem salir = new MenuItem ("Salir");
  112. crearCargar.addActionListener(controller);
  113. crearGuardar.addActionListener(controller);
  114. salir.addActionListener(controller);
  115. menuArchivo.add(crearCargar);
  116. menuArchivo.add(crearGuardar);
  117. menuArchivo.add(salir);
  118.  
  119. // Creo el menú Provincias
  120. Menu menuProvincias = new Menu("Provincias");
  121. MenuItem crearProvincias = new MenuItem ("Crear provincia");
  122. MenuItem borrarProvincias = new MenuItem ("Borrar provincia");
  123. crearProvincias.addActionListener(controller);
  124. borrarProvincias.addActionListener(controller);
  125. menuProvincias.add(crearProvincias);
  126. menuProvincias.add(borrarProvincias);
  127.  
  128. // Creo el menu Poblaciones
  129. Menu menuPoblaciones = new Menu("Poblaciones");
  130. MenuItem crearPoblacion = new MenuItem ("Crear poblacion");
  131. MenuItem borrarPoblacion = new MenuItem ("Borrar poblacion");
  132. MenuItem ordenarNombre = new MenuItem ("Ordenar por nombre");
  133. MenuItem ordenarHabitantes = new MenuItem ("Ordenar por habitantes");
  134. MenuItem modPoblacion = new MenuItem ("Modificar poblacion");
  135. MenuItem movPoblacion = new MenuItem ("Mover poblacion");
  136. crearPoblacion.addActionListener(controller);
  137. borrarPoblacion.addActionListener(controller);
  138. ordenarNombre.addActionListener(controller);
  139. ordenarHabitantes.addActionListener(controller);
  140. modPoblacion.addActionListener(controller);
  141. movPoblacion.addActionListener(controller);
  142. menuPoblaciones.add(crearPoblacion);
  143. menuPoblaciones.add(borrarPoblacion);
  144. menuPoblaciones.add(ordenarNombre);
  145. menuPoblaciones.add(ordenarHabitantes);
  146. menuPoblaciones.add(modPoblacion);
  147. menuPoblaciones.add(movPoblacion);
  148.  
  149. // Creo el menú de ayuda
  150. Menu ayuda = new Menu("Ayuda");
  151. MenuItem acercaDe = new MenuItem("Acerca de");
  152. acercaDe.addActionListener(new AcercaDe());
  153. ayuda.add(acercaDe);
  154.  
  155. //Crea el
  156. barraDeMenu.add(menuArchivo);
  157. barraDeMenu.add(menuProvincias);
  158. barraDeMenu.add(menuPoblaciones);
  159. // Sitúo el menú de ayuda en su sitio
  160. barraDeMenu.setHelpMenu(ayuda);
  161. return barraDeMenu;
  162. }
  163.  
  164. private Panel addToolBar(){
  165. //Sitúo la línea de botones
  166. Panel lineaDeBotones = new Panel(new FlowLayout (FlowLayout.LEFT));
  167. lineaDeBotones.setBackground (Color.lightGray);
  168.  
  169. //Boton crear provincia
  170. Button proCrear = new Button("Crear provincia");
  171. proCrear.addActionListener(controller);
  172.  
  173. //Boton crear poblacion
  174. Button poCrear = new Button("Crear poblacion");
  175. poCrear.addActionListener(controller);
  176.  
  177. //Boton actualizar prediccion
  178. Button aPrediccion = new Button("Actualizar Predicción");
  179. aPrediccion.addActionListener(controller);
  180.  
  181. // Añadir los botones a la barra
  182. lineaDeBotones.add(proCrear);
  183. lineaDeBotones.add(poCrear);
  184. lineaDeBotones.add(aPrediccion);
  185. return lineaDeBotones;
  186. }
  187.  
  188. private Panel addPanelIzquierda(){
  189. //Creamos  panel para mostrar provincias y poblaciones y lo colocamos a la izquierda
  190. Panel izquierda = new Panel(new GridLayout(4,1));
  191.  
  192. Label lProvincia = new Label("Provincias:");
  193. List tProvincias = new List();
  194. Iterator<String> i = almacen.getProvincias().iterator();
  195. while(i.hasNext()){
  196. tProvincias.add(i.next().toString());
  197. }
  198.  
  199.  
  200. Label lPoblacion = new Label("Poblaciones:");
  201. List tPoblaciones = new List();
  202.  
  203. izquierda.add(lProvincia);
  204. izquierda.add(tProvincias);
  205. izquierda.add(lPoblacion);
  206. izquierda.add(tPoblaciones);
  207. return izquierda;
  208. }
  209.  
  210. private Panel addpredicciones(){
  211. //Creamos el panel de las predicciones
  212. Panel predicciones = new Panel(new BorderLayout());
  213. Label lPrediccion = new Label("Predicciones de :");
  214. List tPrediccion = new List();
  215. predicciones.add(lPrediccion,BorderLayout.NORTH);
  216. predicciones.add(tPrediccion,BorderLayout.CENTER);
  217. return predicciones;
  218. }
  219.  
  220. private Panel addlineaEstado(){
  221. //Sitúo la línea de estado
  222. Panel lineaDeEstado = new Panel();
  223. lineaDeEstado.setLayout (new FlowLayout (FlowLayout.LEFT));
  224. lineaDeEstado.setBackground (Color.lightGray);
  225. Label ventanaDeeventos = new Label("Gestor AEMET v1.0 (PAA)");
  226. lineaDeEstado.add (ventanaDeeventos);
  227. return lineaDeEstado;
  228. }
  229.  
  230. private void guardarAntesDeSalir () {
  231.  
  232. // Guardar almacen
  233. System.out.println ("Gracias por utilizar nuestro programa");
  234. }
  235.  
  236.  
  237. /**
  238. * Clase que implementa la acción del menú "acerca de".
  239. */
  240. class AcercaDe implements ActionListener{  // Clase interna
  241. public void actionPerformed(ActionEvent e){
  242. VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe(InterfazAWT_AEMET.this);
  243. ventanaAcercaDe.setVisible(true);
  244. }
  245. }//Acerca de
  246.  
  247.  
  248. //****Acciones menu archivo****
  249. class GuardarArchivo implements ActionListener {
  250. public void actionPerformed(ActionEvent e) {
  251.  
  252. }
  253. }//Guardar en un fichero
  254.  
  255. class CargarArchivo implements ActionListener {
  256. public void actionPerformed(ActionEvent e) {
  257.  
  258. }
  259. }//Cargar desde un archivo
  260.  
  261. class Salir implements ActionListener {
  262. public void actionPerformed(ActionEvent e) {
  263.  
  264. }
  265. }//Salir de la aplicacion
  266.  
  267.  
  268.  
  269.  
  270.  
  271. //Ordena por nombre las poblaciones
  272. class OrdenarNombre implements ActionListener {
  273. public void actionPerformed(ActionEvent e) {
  274.  
  275. }
  276. }
  277.  
  278. //Ordena por numero de habitantes las poblaciones
  279. class OrdenarHabitantes implements ActionListener {
  280. public void actionPerformed(ActionEvent e) {
  281.  
  282. }
  283. }
  284.  
  285. //Modifica los valores de una poblacion
  286. class ModPoblacion implements ActionListener {
  287. public void actionPerformed(ActionEvent e) {
  288.  
  289. }
  290. }
  291.  
  292. //Mueve una poblacion de provincia
  293. class MovPoblacion implements ActionListener {
  294. public void actionPerformed(ActionEvent e) {
  295.  
  296. }
  297. }
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305. //Accion actualizar prediccion
  306. class ActualizarPrediccion implements ActionListener {
  307. public void actionPerformed(ActionEvent e) {
  308.  
  309. }
  310. }
  311.  
  312. /**
  313. * Método main.
  314. * @throws GestorAEMETException
  315. */
  316. public static void main(String[] args) throws GestorAEMETException {
  317.  
  318. InterfazAWT_AEMET mimarco = new InterfazAWT_AEMET("Gestor AEMET",1000,500);
  319. mimarco.setVisible(true);
  320. } // Main
  321. }
  322.  

lo que hago es leer el almacenpoblaciones del archivo, almacenarlo en una variable y posteriormente se me habia ocurrido para mostar en las listas de poblacion y provincia hacer un iterator con los metodos de almacenPoblaciones getPoblaciones y getProvincias, (los cuales devuelven un set cada uno) e ir añadiendo a ambas listas las corresponsientes provincias y poblaciones.

Pero claro si hago todo esto cuando inicio el programa, en el momento que cree una nueva poblacion o provincia he de refrescar las listas por lo que deberia de utilizar un metodo que sea llamado desde los actionlistener de los botones correspondientes no?.


en el programa de arriba me da error aqui:
Código
  1. Iterator<String> i = almacen.getProvincias().iterator();

NullPointerException, no se por que me dice que no hay nada si previamente he utilizado la primera practica para añadir 4 provincias.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 19 Marzo 2015, 21:29 pm
Te repito por tercera vez. Esto no debe ir:

Código
  1. class AcercaDe implements ActionListener{  // Clase interna
  2.  
  3. 241. public void actionPerformed(ActionEvent e){
  4.  
  5. 242. VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe(InterfazAWT_AEMET.this);
  6.  
  7. 243. ventanaAcercaDe.setVisible(true);
  8.  
  9. 244. }
  10.  
  11. 245. }//Acerca de
  12.  
  13. 246.
  14.  
  15. 247.
  16.  
  17. 248. //****Acciones menu archivo****
  18.  
  19. 249. class GuardarArchivo implements ActionListener {
  20.  
  21. 250. public void actionPerformed(ActionEvent e) {
  22.  
  23. 251.
  24.  
  25. 252. }
  26.  
  27. 253. }//Guardar en un fichero
  28.  
  29. 254.
  30.  
  31. 255. class CargarArchivo implements ActionListener {
  32.  
  33. 256. public void actionPerformed(ActionEvent e) {
  34.  
  35. 257.
  36.  
  37. 258. }
  38.  
  39. 259. }//Cargar desde un archivo
  40.  
  41. 260.
  42.  
  43. 261. class Salir implements ActionListener {
  44.  
  45. 262. public void actionPerformed(ActionEvent e) {
  46.  
  47. 263.
  48.  
  49. 264. }
  50.  
  51. 265. }//Salir de la aplicacion
  52.  
  53. 266.
  54.  
  55. 267.
  56.  
  57. 268.
  58.  
  59. 269.
  60.  
  61. 270.
  62.  
  63. 271. //Ordena por nombre las poblaciones
  64.  
  65. 272. class OrdenarNombre implements ActionListener {
  66.  
  67. 273. public void actionPerformed(ActionEvent e) {
  68.  
  69. 274.
  70.  
  71. 275. }
  72.  
  73. 276. }
  74.  
  75. 277.
  76.  
  77. 278. //Ordena por numero de habitantes las poblaciones
  78.  
  79. 279. class OrdenarHabitantes implements ActionListener {
  80.  
  81. 280. public void actionPerformed(ActionEvent e) {
  82.  
  83. 281.
  84.  
  85. 282. }
  86.  
  87. 283. }
  88.  
  89. 284.
  90.  
  91. 285. //Modifica los valores de una poblacion
  92.  
  93. 286. class ModPoblacion implements ActionListener {
  94.  
  95. 287. public void actionPerformed(ActionEvent e) {
  96.  
  97. 288.
  98.  
  99. 289. }
  100.  
  101. 290. }
  102.  
  103. 291.
  104.  
  105. 292. //Mueve una poblacion de provincia
  106.  
  107. 293. class MovPoblacion implements ActionListener {
  108.  
  109. 294. public void actionPerformed(ActionEvent e) {
  110.  
  111. 295.
  112.  
  113. 296. }
  114.  
  115. 297. }
  116.  
  117. 298.
  118.  
  119. 299.
  120.  
  121. 300.
  122.  
  123. 301.
  124.  
  125. 302.
  126.  
  127. 303.
  128.  
  129. 304.
  130.  
  131. 305. //Accion actualizar prediccion
  132.  
  133. 306. class ActualizarPrediccion implements ActionListener {
  134.  
  135. 307. public void actionPerformed(ActionEvent e) {
  136.  
  137. 308.
  138.  
  139. 309. }
  140.  
  141. 310. }

Esto es reemplazado por el MainWindowController:

Código
  1. @Override
  2. public void actionPerformed(ActionEvent evt) {
  3.    String targetLabel = evt.getActionCommad();
  4.    evaluateAction(targetLabel);
  5. }
  6.  
  7. private void evaluateAction(String targetLabel) {
  8.    switch(targetLabel) {
  9.        case "Nueva Provincia": new NewProvinceDialog(gui).setVisible(true); break;
  10.        case "Nueva Población": new NewPopulationDialog(gui).setVisible(true); break;
  11.        case "Salir": gui.dispose();
  12.        // asi con todos los botones
  13.    }
  14. }


AlmacenProvincias (ProvinceService)

Vuelvo a repetir, NO mezclar la lógica de negocio con la vistas. Aplica el patrón MVC que es mucho más sencillo, si te empeñas en seguir mezclando las cosas así, llegarás a un punto donde te estanques porque simplemente no hay arquitectura en tu aplicación, se convertirá en un montón de código sin sentido.

Veamos como puedes realizar lo que deseas. Primero, ProvinceService será un Map:

Código
  1. import java.util.HashMap;
  2. import java.util.HashSet;
  3. import java.util.Map;
  4. import java.util.Set;
  5.  
  6. public class ProvinceService extends LinkedHashMap<String, Set<Population>> {
  7.  
  8. private static ProvinceService instance;
  9.  
  10.    static { instance = new ProvinceService(); }
  11.  
  12.    private ProvinceService() {}
  13.  
  14.    public ProvinceService getInstance() { return instance; }
  15.  
  16. public String addProvince(String provinceName) throws IllegalArgumentException {
  17.        String response = null;
  18.        if(this.containsKey(provinceName))
  19.            throw new IlegalArgumentException("La provincia ya existe");
  20. else {
  21.            this.put(provinceName, null);
  22.            response = "Provinca añadida correctamente";
  23.        }
  24.        return response;
  25. }
  26.  
  27. public String addPopulation(String provinceName, Population population) throws IllegalArgumentException {
  28.        String response = null;
  29. if(!this.containsKey(provinceName)) {
  30. throw new IlegalArgumentException("La provincia no existe, primero créela");
  31. } else {
  32. Set<Population> provincePopulation = getPopulationByProvinceName(provinceName);
  33. provincePopulation.add(population);
  34. response = "Provincia añadida correctamente";
  35. }
  36. return response;
  37. }
  38.  
  39. public String addProvinceAndPopulation(String provinceName, Population population) throws IllegalArgumentException {
  40. String response = null;
  41. if(!this.containsKey(provinceName)) {
  42. Set<Population> provincePopulation = new HashSet<>();
  43. provincePopulation.add(population);
  44. provincesAndPopulations.put(provinceName, provincePopulation);
  45. response = "Provincia y población añadida correctamente";
  46. } else {
  47.            throw new IlegalArgumentException("La provincia ya existe. Agregue solo la población");
  48.        }
  49. return response;
  50. }
  51.  
  52. private Set<Population> getPopulationByProvinceName(String provinceName) {
  53. Set<Population> population = null;
  54. for(Map.Entry<String, Set<Population>> entry : this.entrySet()) {
  55. if(entry.getKey().equals(provinceName))
  56. population = entry.getValue();
  57. }
  58. return population;
  59. }
  60.  
  61. }

MainWindowController.java

Código
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3.  
  4.  
  5. public class MainWindowController implements ActionListener {
  6. private MainWindow gui;
  7.  
  8. public MainWindowController(MainWindow gui) {
  9. this.gui = gui;
  10. }
  11.  
  12. @Override
  13. public void actionPerformed(ActionEvent e) {
  14. String targetLabel = evt.getActionCommad();
  15.        evaluateAction(targetLabel);
  16. }
  17.  
  18.    private void evaluateAction(String targetLabel) {
  19.        switch(targetLabel) {
  20.            case "Nueva Provincia":
  21.                new NewProvinceDialog(gui).setVisible(true); break;
  22.            case "Nueva Población":
  23.                new NewPopulationDialog(gui).setVisible(true); break;
  24.            case "Salir": gui.dispose();
  25.            // asi con todos los botones
  26.        }
  27.    }
  28.  
  29. }

NewProvinceDialog.java

Código
  1. import java.awt.GridBagConstraints;
  2. import java.awt.GridBagLayout;
  3.  
  4. import javax.swing.JButton;
  5. import javax.swing.JDialog;
  6. import javax.swing.JFrame;
  7. import javax.swing.JLabel;
  8. import javax.swing.JPanel;
  9. import javax.swing.JTextField;
  10.  
  11. public class NewProvinceDialog extends JDialog {
  12. private static final long serialVersionUID = -3369879094143739366L;
  13. private JTextField txtProvince;
  14. private JButton btnAddProvince;
  15.  
  16. public NewProvinceDialog(JFrame parent) {
  17. super(parent);
  18. initComponents(parent);
  19. }
  20.  
  21. private void initComponents(JFrame parent) {
  22. JPanel panel = new JPanel(new GridBagLayout());
  23. JLabel label = new JLabel("Nombre de la provincia:");
  24. txtProvince = new JTextField();
  25. btnAddProvince = new JButton("Agregar");
  26.  
  27. constraints.gridx = 0;
  28. constraints.gridy = 0;
  29. constraints.gridwidth = 1;
  30. constraints.gridheight = 1;
  31. constraints.weighty = 1.0;
  32. panel.add(label, constraints);
  33.  
  34. constraints = new GridBagConstraints();
  35. constraints.gridx = 1;
  36. constraints.gridy = 0;
  37. constraints.gridwidth = 3;
  38. constraints.gridheight = 1;
  39. constraints.weightx = 1.0;
  40. constraints.fill = GridBagConstraints.HORIZONTAL;
  41. panel.add(txtProvince, constraints);
  42.  
  43. constraints = new GridBagConstraints();
  44. constraints.gridx = 3;
  45. constraints.gridy = 1;
  46. constraints.gridwidth = 1;
  47. constraints.gridheight = 1;
  48. constraints.anchor = GridBagConstraints.EAST;
  49. panel.add(btnAddProvince, constraints);
  50.  
  51. this.add(panel);
  52. this.setTitle("Agregar nueva provincia");
  53. this.setSize(280,100);
  54. this.setModal(true);
  55. this.setLocationRelativeTo(parent);
  56. this.setResizable(false);
  57.  
  58. }
  59.  
  60.    // getters de los controles
  61.    public JTextField getTxtProvince() { return txtProvince; }
  62.  
  63. }

NewProvinceDialogController.java

Código
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3.  
  4. public class NewProvinceDialogController implements ActionListener {
  5.    private NewProvinceDialog gui;
  6.  
  7.    public NewProvinceDialogController(NewProvinceDialog gui) {
  8.        this.gui = gui;
  9.    }
  10.  
  11.    @Override
  12.    public void actionPerformed(ActionEvent evt) {
  13.        String targetLabel = evt.getActionCommand();
  14.        if(targetLabel.equals("Añadir")) {
  15.            try {
  16.                ProvinceService provinceService = ProvinceService.getInstance();
  17.                String provinceName = gui.getTxtProvince().getText();
  18.                String response = provinceService.addProvince(provinceName);
  19.                new JOptionPane.showMessageDialog(response);
  20.            } catch (IllegalArgumentException e) {
  21.                // muestra 'La provinca ya existe'
  22.                JOptionPane.showMessageDialog(gui, e.getMessage());
  23.            }
  24.        } else {
  25.            gui.dispose();
  26.        }
  27.    }
  28.  
  29. }




ProvinceService la he transformado para que sea un LinkedHashMap. Como te dije será un Singleton (No es nada de extraordinario, es una clase normal solo que su constructor es privado evitando que sea creen instancias de ella) que será compartida por todos los objetos.

En NewProvinceDialogController hacemos uso de ProvinceService:

Código
  1. @Override
  2.    public void actionPerformed(ActionEvent evt) {
  3.        String targetLabel = evt.getActionCommand();
  4.        if(targetLabel.equals("Añadir")) {
  5.            try {
  6.                ProvinceService provinceService = ProvinceService.getInstance();
  7.                String provinceName = gui.getTxtProvince().getText();
  8.                String response = provinceService.addProvince(provinceName);
  9.                new JOptionPane.showMessageDialog(response);
  10.            } catch (IllegalArgumentException e) {
  11.                // muestra 'La provinca ya existe'
  12.                JOptionPane.showMessageDialog(gui, e.getMessage());
  13.            }
  14.        } else {
  15.            gui.dispose();
  16.        }
  17.    }

Si se ha clickeado "Añadir" en el JDialog para añadir una nueva provincia, se obtiene la única instancia de ProvinceService que como ya dijimos es un LinkedHashMap. Así mismo, sigue teniendo los mismos métodos por lo que todo sigue funcionando como antes. Obtenemos el JTextField txtProvince de NewProvinceDialog y usamos el método getText() para obtener lo que el usuario ha escrito. Luego, llamamos al método addProvince que se encargará de verificar si existe o si no existe y tomar la acción adecuada. Si la provincia existe mostrará un mensaje que es el que se le asocia a la Exception lanzada desde el método addProvince:

Código
  1. throw new IllegalArgumentException("La provincia ya existe");

Que luego recojemos en el controlador de NewProvinceDialogController:

Código
  1.    // muestra 'La provinca ya existe'
  2.    JOptionPane.showMessageDialog(e.getMessage());
  3. }

Si la provincia se añadió correctamente, el mensaje de éxito retornado se muestra:

Código
  1. String response = provinceService.addProvince(provinceName);
  2. JOptionPane.showMessageDialog(response);


Sigue el mismo patrón. De ésta manera modularizas bien tu aplicación y le das una arquitectura sólida, claves para un diseño escalable  ;)


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 20 Marzo 2015, 13:00 pm
la clase principal tiene tantos listener por que aun no los he quitado, segun voy creando las clases los voy eliminando para que quede como MWC:
he intentado hacer lo que me has dicho creando otra clase controller para la ventana provincia,me dibuja la ventana pero no me deja cerrarla por lo que el codigo gui.dispose(); no lo ejecuta:


Código
  1. package Provincia;
  2.  
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5.  
  6. public class VentanaCrearProvinciaController implements ActionListener {
  7. private VentanaCrearProvincia gui;
  8.  
  9. public VentanaCrearProvinciaController(VentanaCrearProvincia gui){
  10. this.gui = gui;
  11. }
  12. public void actionPerformed(ActionEvent e) {
  13. String label = e.getActionCommand();
  14. if(label.equals("Crear")){
  15.  
  16. }else{
  17. gui.dispose();
  18. }
  19. }
  20.  
  21. }
  22.  

ventana crearprovincia
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.Panel;
  8. import java.awt.TextField;
  9.  
  10. public class VentanaCrearProvincia extends Dialog {
  11.  
  12. private TextField textField;
  13. private Button crear;
  14. private Button cancelar;
  15.  
  16. private static final long serialVersionUID = -2530069431684593677L;
  17. public VentanaCrearProvincia(Frame gui) {
  18. super(gui);
  19. initComponents(gui);
  20. }
  21.  
  22. public void initComponents (Frame gui){
  23. Panel panel = new Panel(new GridLayout(2,2,0,0));
  24. Label label = new Label("Provincia:");
  25. textField = new TextField();
  26. crear = new Button("Crear");
  27. cancelar = new Button("Cancelar");
  28. setLocationRelativeTo(gui);
  29. this.setTitle("Crear Provincia");
  30. this.setSize(300, 100);
  31. panel.add(label);
  32. panel.add(textField);
  33. panel.add(crear);
  34. panel.add(cancelar);
  35. this.add(panel);
  36. }
  37. public TextField getTxtProvincia(){
  38. return textField;
  39. }
  40. }
  41.  

respecto al almacenpoblaciones, este es mi codigo, que es el correspondiente a la primera practica y funciona perfectamente, como implementa las interfaces iAlmacenpoblaciones e IPoblacionAEMET, no tengo que hacer extends de linkedhashmap ni de set no? por que esas interfaces ya lo tendran implementado, las interfaces nos las han dado en un paquete .jar


Código
  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.io.Serializable;
  7. import java.util.Comparator;
  8. import java.util.HashMap;
  9. import java.util.Iterator;
  10. import java.util.Map;
  11. import java.util.Set;
  12. import java.util.SortedSet;
  13. import java.util.TreeSet;
  14.  
  15. import paa.provincias.IAlmacenPoblaciones;
  16. import paa.provincias.IPoblacion;
  17. import paa.provincias.IPoblacionAEMET;
  18.  
  19. /**
  20.  * Clase que modela un almacen de poblaciones
  21.  * @author kikian
  22.  *
  23.  */
  24. public class AlmacenPoblaciones implements IAlmacenPoblaciones, Serializable,IPoblacionAEMET {
  25.  
  26. /**
  27. *
  28. */
  29. private static final long serialVersionUID = 1L;
  30. private Map<String, SortedSet<IPoblacion>> Aprovincias = new HashMap<String, SortedSet<IPoblacion>>();
  31.  
  32. /**Ordenación principal en orden alfabético por el campo nombre de la población.
  33. */
  34. final static int  ORDENARPORNOMBRE = 2;
  35.  
  36. /**Ordenación principal por el número de habitantes en sentido ascendente, en segundo lugar, en caso de igualdad, por
  37.      * el orden alfabético del campo nombre.
  38. */
  39. final static int  ORDENARPORHABITANTES = 3;
  40.  
  41. /**
  42. * Constructor de la clase AlmacenPoblaciones
  43. */
  44. public AlmacenPoblaciones(){
  45. Aprovincias = new HashMap<String, SortedSet<IPoblacion>>();
  46. }
  47.  
  48. /**
  49. *  Añade una población a la provincia correspondiente si la población no existe ya en ella, o sea, no hay ya otra
  50. población con el mismo nombre. Las poblaciones se almacenarán ordenadas según el criterio de ordenación definido.
  51. @param provincia - Provincia en la que se añadira la poblacion
  52. @param poblacion - Poblacion a añadir
  53. */
  54. public boolean addPoblacion(String provincia, IPoblacion poblacion) {
  55. boolean res = false;
  56. if(provincia == null || poblacion == null || !Aprovincias.containsKey(provincia)){
  57. res = false;
  58. System.out.println("La Provincia no existe, creela antes de añadir poblacion");
  59. }else{
  60. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  61. sPoblacion.add(poblacion);
  62. Aprovincias.put(provincia, sPoblacion);
  63. res = true;
  64. }
  65. return res;
  66. }
  67.  
  68. /**
  69. *  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
  70. mismo nombre no se realiza ningún cambio en el almacén y la llamada devuelve false.
  71. @param provincia - La provincia que queremos añadir
  72. */
  73. public boolean addProvincia(String provincia) {
  74. boolean res = false;
  75. if(Aprovincias.containsKey(provincia)){
  76. System.out.println("Ya existe la provincia");
  77. }else{
  78. Aprovincias.put(provincia, new TreeSet<IPoblacion>());
  79. res = true;
  80. }
  81. return res;
  82. }
  83.  
  84. /**
  85. *  Indica si ya existe en la provincia una población con ese nombre.
  86. *  @param provincia - Nombre de la provincia en la que vamos a buscar
  87. *  @param poblacion - Nombre de la poblacion que queremos buscar
  88. */
  89. public boolean containsPoblacion(String provincia, String poblacion) {
  90. boolean res = false;
  91. if(provincia == null || !Aprovincias.containsKey(provincia)){
  92. System.out.println("La provincia no existe, creela antes de eliminar poblacion");
  93. }else{
  94. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  95. for(IPoblacion p:sPoblacion){
  96. if(p.getNombre()==poblacion){
  97. res = true;
  98. }
  99. }
  100. }
  101. return res;
  102. }
  103.  
  104. /**
  105. * Indica si ya existe en la provincia una población.
  106. * @param provincia - La provincia en la que buscaremos
  107. * @param poblacion - La poblacion que queremos buscar
  108. */
  109. public boolean containsPoblacion(String provincia, IPoblacion poblacion) {
  110. boolean res = false;
  111. if(provincia == null || !Aprovincias.containsKey(provincia)){
  112. System.out.println("La provincia no existe, creela antes de eliminar poblacion");
  113. }else{
  114. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  115. if(sPoblacion.contains(poblacion)){
  116. res = true;
  117. }
  118. }
  119. return res;
  120. }
  121.  
  122. /**
  123. *  Indica si ya existe en el almacén la provincia correspondiente.
  124. *  @param provincia - La provincia que queremos comprobar
  125. */
  126. public boolean containsProvincia(String provincia) {
  127. boolean res = false;
  128. if(Aprovincias.containsKey(provincia)){
  129. res = true;
  130. System.out.println("La provincia esta en el almacen");
  131. }else{
  132. System.out.println("La provincia no esta en el almacen");
  133. }
  134. return res;
  135. }
  136.  
  137. /**
  138. *  Borra la población situada en la posición correspondiente dentro de la provincia. La posición es un
  139. * entero entre 1 y el número de poblaciones que contiene la provincia. La posición de una
  140. * población es variable, puesto que cambia si se borran poblaciones de la provincia o se reordena.
  141. *  @param provincia - Provincia en la que buscaremos la poblacion
  142. *  @param posicion - posicion de la poblacion que sera borrada
  143. */
  144. public boolean delPoblacion(String provincia, int posicion) {
  145. if(!Aprovincias.containsKey(provincia)){
  146. System.out.println("No existe la provincia");
  147. return false;
  148. }else{
  149. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  150. Iterator<IPoblacion> ite = sPoblacion.iterator();
  151. int contador = 1;
  152. while(ite.hasNext() && contador < posicion){
  153. ite.next();
  154. contador++;
  155. }
  156. if(ite.hasNext() && contador == posicion){
  157. ite.next();
  158. ite.remove();
  159. Aprovincias.put(provincia, sPoblacion);
  160. return true;
  161. }
  162. }
  163. return false;
  164. }
  165.  
  166. /**
  167. *  Borra de la provincia la población que se pasa como parámetro.
  168. *  @param provincia - La provincia donde buscaremos
  169. *  @param poblacion - La poblacion que se eliminara
  170. */
  171. public boolean delPoblacion(String provincia, IPoblacion poblacion) {
  172. boolean res = false;
  173. if(!Aprovincias.containsKey(provincia)){
  174. System.out.print("La provincia no existe");
  175. }else{
  176. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  177. sPoblacion.remove(poblacion);
  178. Aprovincias.put(provincia, sPoblacion);
  179. }
  180. return res;
  181. }
  182.  
  183. /**
  184. * Borra de la provincia la población cuyo nombre se pasa como parámetro.
  185. * @param provincia - La provincia de donde eliminaremos la poblacion
  186. * @param poblacion - El nombre de la poblacion
  187. */
  188. public boolean delPoblacion(String provincia, String poblacion) {
  189. if(!Aprovincias.containsKey(provincia)){
  190. System.out.print("La provincia no existe");
  191. return false;
  192. }else{
  193. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  194. for(IPoblacion s : sPoblacion){
  195. if(s.getNombre().equals(poblacion)){
  196. sPoblacion.remove(s);
  197. return true;
  198. }
  199. }
  200. return false;
  201. }
  202. }
  203.  
  204. /**
  205. * Borra un provincia del almacén de poblaciones si está presente en el almacén. Si no hay una del mismo nombre no
  206. se realiza ningún cambio en el almacén y la llamada devuelve false.
  207. @param provincia - La provincia que queremos eliminar
  208. */
  209. public boolean delProvincia(String provincia) {
  210. if(Aprovincias.containsKey(provincia)){
  211. Aprovincias.remove(provincia);
  212. return true;
  213. }else{
  214. System.out.println("La provincia no esta en el almacen");
  215. return false;
  216. }
  217. }
  218.  
  219. /**
  220. * Devuelve el número de poblaciones que contiene la provincia cuyo nombre se indica.
  221. *  @param provincia - La provincia de la que obtendremos el numero de poblaciones
  222. */
  223. public int getNumPoblaciones(String provincia) {
  224. SortedSet<IPoblacion> spoblacion = Aprovincias.get(provincia);
  225. return spoblacion.size();
  226. }
  227.  
  228. /**
  229. * Devuelve la población situada en la posición correspondiente dentro de la provincia. La posición es un
  230. * entero entre 1 y el número de poblaciones que contiene la provincia. La posición de una población es variable, puesto
  231. * que cambia si se borran poblaciones de la provincia o se reordenan.
  232. * @param provincia - la provincia en la que se buscara
  233. * @param posicion - la posicion que se eliminara
  234. */
  235. public IPoblacion getPoblacion(String provincia, int posicion) {
  236. IPoblacion pBuscada = null;
  237. if(!Aprovincias.containsKey(provincia)){
  238. System.out.println("No existe la provincia");
  239. }else{
  240. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  241. Iterator<IPoblacion> ite = sPoblacion.iterator();
  242. int contador = 1;
  243. while(ite.hasNext() && contador < posicion){
  244. ite.next();
  245. contador++;
  246. }
  247. if(ite.hasNext() && contador == posicion){
  248. pBuscada = ite.next();
  249. ite.remove();
  250. }
  251. }
  252. return pBuscada;
  253. }
  254.  
  255. /**Devuelve de la provincia la población que posee el nombre que se pasa como parámetro.
  256. *
  257. */
  258. public IPoblacion getPoblacion(String provincia, String poblacion) {
  259. SortedSet<IPoblacion> spoblacion = Aprovincias.get(provincia);
  260. IPoblacion p = null;
  261. for(IPoblacion s : spoblacion){
  262. if(s.getNombre().equals(poblacion)){
  263. p = s;
  264. }
  265. }
  266. return p;
  267. }
  268.  
  269. /**
  270. * Devuelve todas las poblaciones de la provincia correspondiente ordenadas según el criterio actual.
  271. * @param provincia - La provincia de la que obtendremos el Set con las poblaciones
  272. */
  273. public SortedSet<IPoblacion> getPoblaciones(String provincia) {
  274. SortedSet<IPoblacion> spoblacion = null;
  275. if(!Aprovincias.containsKey(provincia)){
  276. System.out.println("No existe la provincia");
  277. }else{
  278. spoblacion = Aprovincias.get(provincia);
  279. }
  280. return spoblacion;
  281. }
  282.  
  283. /**
  284. * Devuelve un conjunto con los nombres de los provincias que existen en el almacén de poblaciones.
  285. */
  286. public Set<String> getProvincias() {
  287. Set<String> provincias = Aprovincias.keySet();
  288. return provincias;
  289. }
  290.  
  291. /**Guarda el almacén de poblaciones en el fichero cuyo nombre se pasa como parámetro. Devuelve true si se ha guardado
  292. * correctamente y false si hay algún tipo de error o excepción.
  293. * @param escritura - nombre del fichero
  294. */
  295. public boolean guardar(String escritura) {
  296. ObjectOutputStream salida =null;
  297. try{
  298. salida = new ObjectOutputStream (new FileOutputStream (escritura));
  299. salida.writeObject(Aprovincias);
  300. }catch(Exception e){
  301. e.printStackTrace();
  302. }
  303. finally{
  304. if(salida!=null)
  305. try{
  306. salida.close();
  307. return true;
  308. }catch (IOException e){
  309. e.printStackTrace();
  310. }
  311. }
  312. return false;
  313. }
  314.  
  315. /**Permite cambiar el criterio de ordenación de la correspondiente provincia, las poblaciones almacenadas
  316. * serán reordenadas según el nuevo criterio de ordenación que se indica como parámetro utilizando las constantes
  317. * predefinidas: ORDENARPORNOMBRE ú ORDENARPORHABITANTES (ver su descripción en fields).
  318. * @param provincia - Provincia en la que se reordenaran las poblaciones
  319. * @param ordenarPor - Metodo para ordenar las poblaciones
  320. */
  321. public boolean ordenarPor(String provincia, int ordenarPor) {
  322. if(provincia != null || ordenarPor != ORDENARPORNOMBRE || ordenarPor != ORDENARPORHABITANTES ){
  323. if(ordenarPor == ORDENARPORNOMBRE){
  324. //Metemos en un Set las poblaciones de la provincia asociada
  325. Set<IPoblacion> spoblacion = Aprovincias.get(provincia);
  326. //Creamos un nuevo Set de tipo TreeSet y le aplicamos el criterio de ordenacion
  327. //de la clase porNombre, luego le añadimos todas las poblaciones para que se ordenen
  328. TreeSet<IPoblacion> n1Poblacion = new TreeSet<IPoblacion>(new porNombre());
  329. n1Poblacion.addAll(spoblacion);
  330. Aprovincias.put(provincia, n1Poblacion);
  331. }else if(ordenarPor == ORDENARPORHABITANTES){
  332. //Mismo procedimiento que ORDENARPORNOMBRE pero ahora utilizamos el criterio de ordenacion
  333. //de la clase CompareHabitantes
  334. Set<IPoblacion> spoblacion = Aprovincias.get(provincia);
  335. TreeSet<IPoblacion> n2Poblacion = new TreeSet<IPoblacion>(new CompareHabitantes());
  336. n2Poblacion.addAll(spoblacion);
  337. Aprovincias.put(provincia, n2Poblacion);
  338. }
  339. return true;
  340. }
  341. return false;
  342. }
  343.  
  344. /**Recupera un almacén de poblaciones del fichero cuyo nombre se pasa como parámetro. Si el fichero no existe o
  345. *  hay algún tipo de excepción devuelve false y crea un almacén vacío. Si lo recupera, devuelve true.
  346. * @param lectura - Nombre del archivo que leeremos
  347. */
  348. public boolean recuperar(String lectura) {
  349. ObjectInputStream entrada = null;
  350. try{
  351. entrada = new ObjectInputStream (new FileInputStream (lectura));
  352. @SuppressWarnings("unchecked")
  353. Map<String, SortedSet<IPoblacion>> Aprovincias2 = (Map<String, SortedSet<IPoblacion>>) entrada.readObject();
  354. System.out.println(Aprovincias2.entrySet());
  355. }catch(Exception e){
  356. e.printStackTrace();
  357. }
  358. finally{
  359. if(entrada!=null)
  360. try{
  361. entrada.close();
  362. return true;
  363. }catch (IOException e){
  364. e.printStackTrace();
  365. }
  366. }
  367. return false;
  368. }
  369.  
  370. /**
  371. * Clase para comparar las poblaciones por nombre
  372. * @author kikian
  373. *
  374. */
  375. class porNombre implements Comparator<IPoblacion>{
  376. @Override
  377. public int compare(IPoblacion o1, IPoblacion o2) {
  378. return o1.getNombre().compareTo(o2.getNombre());
  379. }
  380.  
  381. }
  382.  
  383. @Override
  384. public String getCodigoAEMET() {
  385. // TODO Auto-generated method stub
  386. return null;
  387. }
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418. }
  419.  


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 20 Marzo 2015, 15:50 pm
Olvidaba que es AWT. Reemplaza gui.dispose por:

Código
  1. Window window = SwingUtilities.getWindowAncestor(gui);
  2. window.dispose();

Respecto a lo otro, si el docente les ha dado esas interfaces en un JAR pues debes usarlas y no hacerme caso cuando te dije que extendieras de LinkedHashMap.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 21 Marzo 2015, 11:01 am
pero si es awt no puedo utilizar Swing utilities  por que esta incluido dentro de Swing.

tengo que crear un metodo que actualize las listas de las predicciones cada vez que borre o añada poblacion o provincia no?


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 21 Marzo 2015, 11:05 am
Cuando se dice que no utilices Swing se hace referencia a que no utilices controles gráficos de Swing. SwingUtilities es simplemente una clase utilitaria.

Tampoco hay que irse por los extremos xD

Respecto a lo otro, sí hay que hay que hacer un método que actualice las provincias y poblaciones.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 21 Marzo 2015, 11:50 am
sigue sin cerrar la ventana, los botones crear y cancelar no hacen nada, y el de cerrar la ventana hace que se cierre por que puse el window adapter sino tampoco se cerraria:

Código
  1. package Provincia;
  2.  
  3.  
  4. import java.awt.Window;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7.  
  8.  
  9. import javax.swing.SwingUtilities;
  10.  
  11. import Provincia.VentanaCrearProvincia;
  12.  
  13. public class VentanaCrearProvinciaController implements ActionListener {
  14. private VentanaCrearProvincia gui;
  15.  
  16. public VentanaCrearProvinciaController(VentanaCrearProvincia gui){
  17. this.gui = gui;
  18. }
  19.  
  20. public void actionPerformed(ActionEvent e) {
  21. String label = e.getActionCommand();
  22. if(label.equals("Crear")){
  23. System.out.println("hola");
  24. try{
  25.  
  26.  
  27. Aviso aviso = new Aviso(gui,e1.getMessage());
  28. }
  29. }else{
  30. Window window = SwingUtilities.getWindowAncestor(gui);
  31. window.dispose();
  32. }
  33. }
  34.  
  35. }
  36.  


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.Panel;
  8. import java.awt.TextField;
  9. import java.awt.event.WindowAdapter;
  10. import java.awt.event.WindowEvent;
  11.  
  12. public class VentanaCrearProvincia extends Dialog {
  13.  
  14. private TextField textField;
  15. private Button crear;
  16. private Button cancelar;
  17.  
  18. private static final long serialVersionUID = -2530069431684593677L;
  19. public VentanaCrearProvincia(Frame gui) {
  20. super(gui);
  21. initComponents(gui);
  22.  
  23. }
  24.  
  25. public void initComponents (Frame gui){
  26. Panel panel = new Panel(new GridLayout(2,2,0,0));
  27. Label label = new Label("Provincia:");
  28. textField = new TextField();
  29. crear = new Button("Crear");
  30. cancelar = new Button("Cancelar");
  31. setLocationRelativeTo(gui);
  32. this.setTitle("Crear Provincia");
  33. this.setSize(300, 100);
  34. panel.add(label);
  35. panel.add(textField);
  36. panel.add(crear);
  37. panel.add(cancelar);
  38. this.add(panel);
  39. addWindowListener (new WindowAdapter (){
  40.        public void windowClosing(WindowEvent e) {
  41.        VentanaCrearProvincia.this.dispose();
  42.           }
  43.        });
  44. }
  45. public TextField getTxtProvincia(){
  46. return textField;
  47. }
  48. }
  49.  

respecto al almacen poblaciones lo he dejado asi:

Código
  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.io.Serializable;
  7. import java.util.Comparator;
  8. import java.util.HashMap;
  9. import java.util.Iterator;
  10.  
  11. import java.util.Map;
  12. import java.util.Set;
  13. import java.util.SortedSet;
  14. import java.util.TreeSet;
  15.  
  16.  
  17. import paa.provincias.IAlmacenPoblaciones;
  18. import paa.provincias.IPoblacion;
  19. import paa.provincias.IPoblacionAEMET;
  20.  
  21. /**
  22.  * Clase que modela un almacen de poblaciones
  23.  * @author kikian
  24.  *
  25.  */
  26. public class AlmacenPoblaciones implements IAlmacenPoblaciones, Serializable,IPoblacionAEMET {
  27.  
  28. /**
  29. *
  30. */
  31. private static final long serialVersionUID = 1L;
  32. private Map<String, SortedSet<IPoblacion>> Aprovincias = new HashMap<String, SortedSet<IPoblacion>>();
  33.  
  34. /**Ordenación principal en orden alfabético por el campo nombre de la población.
  35. */
  36. final static int  ORDENARPORNOMBRE = 2;
  37.  
  38. /**Ordenación principal por el número de habitantes en sentido ascendente, en segundo lugar, en caso de igualdad, por
  39.      * el orden alfabético del campo nombre.
  40. */
  41. final static int  ORDENARPORHABITANTES = 3;
  42.  
  43. /**
  44. * Constructor de la clase AlmacenPoblaciones
  45. */
  46. public AlmacenPoblaciones(){
  47. Aprovincias = new HashMap<String, SortedSet<IPoblacion>>();
  48. }
  49.  
  50.  
  51.  
  52.  
  53. private static AlmacenPoblaciones instance = null;
  54. static { instance = new AlmacenPoblaciones(); }
  55.  
  56.  
  57. public static AlmacenPoblaciones getInstance(){
  58. return instance;
  59. }
  60.  
  61.  
  62. /**
  63. *  Añade una población a la provincia correspondiente si la población no existe ya en ella, o sea, no hay ya otra
  64. población con el mismo nombre. Las poblaciones se almacenarán ordenadas según el criterio de ordenación definido.
  65. @param provincia - Provincia en la que se añadira la poblacion
  66. @param poblacion - Poblacion a añadir
  67. */
  68. public boolean addPoblacion(String provincia, IPoblacion poblacion) {
  69. boolean res = false;
  70. if(provincia == null || poblacion == null || !Aprovincias.containsKey(provincia)){
  71. res = false;
  72. System.out.println("La Provincia no existe, creela antes de añadir poblacion");
  73. }else{
  74. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  75. sPoblacion.add(poblacion);
  76. Aprovincias.put(provincia, sPoblacion);
  77. res = true;
  78. }
  79. return res;
  80. }
  81.  
  82. /**
  83. *  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
  84. mismo nombre no se realiza ningún cambio en el almacén y la llamada devuelve false.
  85. @param provincia - La provincia que queremos añadir
  86. */
  87. public boolean addProvincia(String provincia) {
  88. boolean res = false;
  89. if(Aprovincias.containsKey(provincia)){
  90. System.out.println("Ya existe la provincia");
  91. }else{
  92. Aprovincias.put(provincia, new TreeSet<IPoblacion>());
  93. res = true;
  94. }
  95. return res;
  96. }
  97.  
  98. /**
  99. *  Indica si ya existe en la provincia una población con ese nombre.
  100. *  @param provincia - Nombre de la provincia en la que vamos a buscar
  101. *  @param poblacion - Nombre de la poblacion que queremos buscar
  102. */
  103. public boolean containsPoblacion(String provincia, String poblacion) {
  104. boolean res = false;
  105. if(provincia == null || !Aprovincias.containsKey(provincia)){
  106. System.out.println("La provincia no existe, creela antes de eliminar poblacion");
  107. }else{
  108. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  109. for(IPoblacion p:sPoblacion){
  110. if(p.getNombre()==poblacion){
  111. res = true;
  112. }
  113. }
  114. }
  115. return res;
  116. }
  117.  
  118. /**
  119. * Indica si ya existe en la provincia una población.
  120. * @param provincia - La provincia en la que buscaremos
  121. * @param poblacion - La poblacion que queremos buscar
  122. */
  123. public boolean containsPoblacion(String provincia, IPoblacion poblacion) {
  124. boolean res = false;
  125. if(provincia == null || !Aprovincias.containsKey(provincia)){
  126. System.out.println("La provincia no existe, creela antes de eliminar poblacion");
  127. }else{
  128. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  129. if(sPoblacion.contains(poblacion)){
  130. res = true;
  131. }
  132. }
  133. return res;
  134. }
  135.  
  136. /**
  137. *  Indica si ya existe en el almacén la provincia correspondiente.
  138. *  @param provincia - La provincia que queremos comprobar
  139. */
  140. public boolean containsProvincia(String provincia) {
  141. boolean res = false;
  142. if(Aprovincias.containsKey(provincia)){
  143. res = true;
  144. System.out.println("La provincia esta en el almacen");
  145. }else{
  146. System.out.println("La provincia no esta en el almacen");
  147. }
  148. return res;
  149. }
  150.  
  151. /**
  152. *  Borra la población situada en la posición correspondiente dentro de la provincia. La posición es un
  153. * entero entre 1 y el número de poblaciones que contiene la provincia. La posición de una
  154. * población es variable, puesto que cambia si se borran poblaciones de la provincia o se reordena.
  155. *  @param provincia - Provincia en la que buscaremos la poblacion
  156. *  @param posicion - posicion de la poblacion que sera borrada
  157. */
  158. public boolean delPoblacion(String provincia, int posicion) {
  159. if(!Aprovincias.containsKey(provincia)){
  160. System.out.println("No existe la provincia");
  161. return false;
  162. }else{
  163. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  164. Iterator<IPoblacion> ite = sPoblacion.iterator();
  165. int contador = 1;
  166. while(ite.hasNext() && contador < posicion){
  167. ite.next();
  168. contador++;
  169. }
  170. if(ite.hasNext() && contador == posicion){
  171. ite.next();
  172. ite.remove();
  173. Aprovincias.put(provincia, sPoblacion);
  174. return true;
  175. }
  176. }
  177. return false;
  178. }
  179.  
  180. /**
  181. *  Borra de la provincia la población que se pasa como parámetro.
  182. *  @param provincia - La provincia donde buscaremos
  183. *  @param poblacion - La poblacion que se eliminara
  184. */
  185. public boolean delPoblacion(String provincia, IPoblacion poblacion) {
  186. boolean res = false;
  187. if(!Aprovincias.containsKey(provincia)){
  188. System.out.print("La provincia no existe");
  189. }else{
  190. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  191. sPoblacion.remove(poblacion);
  192. Aprovincias.put(provincia, sPoblacion);
  193. }
  194. return res;
  195. }
  196.  
  197. /**
  198. * Borra de la provincia la población cuyo nombre se pasa como parámetro.
  199. * @param provincia - La provincia de donde eliminaremos la poblacion
  200. * @param poblacion - El nombre de la poblacion
  201. */
  202. public boolean delPoblacion(String provincia, String poblacion) {
  203. if(!Aprovincias.containsKey(provincia)){
  204. System.out.print("La provincia no existe");
  205. return false;
  206. }else{
  207. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  208. for(IPoblacion s : sPoblacion){
  209. if(s.getNombre().equals(poblacion)){
  210. sPoblacion.remove(s);
  211. return true;
  212. }
  213. }
  214. return false;
  215. }
  216. }
  217.  
  218. /**
  219. * Borra un provincia del almacén de poblaciones si está presente en el almacén. Si no hay una del mismo nombre no
  220. se realiza ningún cambio en el almacén y la llamada devuelve false.
  221. @param provincia - La provincia que queremos eliminar
  222. */
  223. public boolean delProvincia(String provincia) {
  224. if(Aprovincias.containsKey(provincia)){
  225. Aprovincias.remove(provincia);
  226. return true;
  227. }else{
  228. System.out.println("La provincia no esta en el almacen");
  229. return false;
  230. }
  231. }
  232.  
  233. /**
  234. * Devuelve el número de poblaciones que contiene la provincia cuyo nombre se indica.
  235. *  @param provincia - La provincia de la que obtendremos el numero de poblaciones
  236. */
  237. public int getNumPoblaciones(String provincia) {
  238. SortedSet<IPoblacion> spoblacion = Aprovincias.get(provincia);
  239. return spoblacion.size();
  240. }
  241.  
  242. /**
  243. * Devuelve la población situada en la posición correspondiente dentro de la provincia. La posición es un
  244. * entero entre 1 y el número de poblaciones que contiene la provincia. La posición de una población es variable, puesto
  245. * que cambia si se borran poblaciones de la provincia o se reordenan.
  246. * @param provincia - la provincia en la que se buscara
  247. * @param posicion - la posicion que se eliminara
  248. */
  249. public IPoblacion getPoblacion(String provincia, int posicion) {
  250. IPoblacion pBuscada = null;
  251. if(!Aprovincias.containsKey(provincia)){
  252. System.out.println("No existe la provincia");
  253. }else{
  254. SortedSet<IPoblacion> sPoblacion = Aprovincias.get(provincia);
  255. Iterator<IPoblacion> ite = sPoblacion.iterator();
  256. int contador = 1;
  257. while(ite.hasNext() && contador < posicion){
  258. ite.next();
  259. contador++;
  260. }
  261. if(ite.hasNext() && contador == posicion){
  262. pBuscada = ite.next();
  263. ite.remove();
  264. }
  265. }
  266. return pBuscada;
  267. }
  268.  
  269. /**Devuelve de la provincia la población que posee el nombre que se pasa como parámetro.
  270. *
  271. */
  272. public IPoblacion getPoblacion(String provincia, String poblacion) {
  273. SortedSet<IPoblacion> spoblacion = Aprovincias.get(provincia);
  274. IPoblacion p = null;
  275. for(IPoblacion s : spoblacion){
  276. if(s.getNombre().equals(poblacion)){
  277. p = s;
  278. }
  279. }
  280. return p;
  281. }
  282.  
  283. /**
  284. * Devuelve todas las poblaciones de la provincia correspondiente ordenadas según el criterio actual.
  285. * @param provincia - La provincia de la que obtendremos el Set con las poblaciones
  286. */
  287. public SortedSet<IPoblacion> getPoblaciones(String provincia) {
  288. SortedSet<IPoblacion> spoblacion = null;
  289. if(!Aprovincias.containsKey(provincia)){
  290. System.out.println("No existe la provincia");
  291. }else{
  292. spoblacion = Aprovincias.get(provincia);
  293. }
  294. return spoblacion;
  295. }
  296.  
  297. /**
  298. * Devuelve un conjunto con los nombres de los provincias que existen en el almacén de poblaciones.
  299. */
  300. public Set<String> getProvincias() {
  301. Set<String> provincias = Aprovincias.keySet();
  302. return provincias;
  303. }
  304.  
  305. /**Guarda el almacén de poblaciones en el fichero cuyo nombre se pasa como parámetro. Devuelve true si se ha guardado
  306. * correctamente y false si hay algún tipo de error o excepción.
  307. * @param escritura - nombre del fichero
  308. */
  309. public boolean guardar(String escritura) {
  310. ObjectOutputStream salida =null;
  311. try{
  312. salida = new ObjectOutputStream (new FileOutputStream (escritura));
  313. salida.writeObject(Aprovincias);
  314. }catch(Exception e){
  315. e.printStackTrace();
  316. }
  317. finally{
  318. if(salida!=null)
  319. try{
  320. salida.close();
  321. System.out.println("Guardado");
  322. return true;
  323. }catch (IOException e){
  324. e.printStackTrace();
  325. }
  326. }
  327. return false;
  328. }
  329.  
  330. /**Permite cambiar el criterio de ordenación de la correspondiente provincia, las poblaciones almacenadas
  331. * serán reordenadas según el nuevo criterio de ordenación que se indica como parámetro utilizando las constantes
  332. * predefinidas: ORDENARPORNOMBRE ú ORDENARPORHABITANTES (ver su descripción en fields).
  333. * @param provincia - Provincia en la que se reordenaran las poblaciones
  334. * @param ordenarPor - Metodo para ordenar las poblaciones
  335. */
  336. public boolean ordenarPor(String provincia, int ordenarPor) {
  337. if(provincia != null || ordenarPor != ORDENARPORNOMBRE || ordenarPor != ORDENARPORHABITANTES ){
  338. if(ordenarPor == ORDENARPORNOMBRE){
  339. //Metemos en un Set las poblaciones de la provincia asociada
  340. Set<IPoblacion> spoblacion = Aprovincias.get(provincia);
  341. //Creamos un nuevo Set de tipo TreeSet y le aplicamos el criterio de ordenacion
  342. //de la clase porNombre, luego le añadimos todas las poblaciones para que se ordenen
  343. TreeSet<IPoblacion> n1Poblacion = new TreeSet<IPoblacion>(new porNombre());
  344. n1Poblacion.addAll(spoblacion);
  345. Aprovincias.put(provincia, n1Poblacion);
  346. }else if(ordenarPor == ORDENARPORHABITANTES){
  347. //Mismo procedimiento que ORDENARPORNOMBRE pero ahora utilizamos el criterio de ordenacion
  348. //de la clase CompareHabitantes
  349. Set<IPoblacion> spoblacion = Aprovincias.get(provincia);
  350. TreeSet<IPoblacion> n2Poblacion = new TreeSet<IPoblacion>(new CompareHabitantes());
  351. n2Poblacion.addAll(spoblacion);
  352. Aprovincias.put(provincia, n2Poblacion);
  353. }
  354. return true;
  355. }
  356. return false;
  357. }
  358.  
  359. /**Recupera un almacén de poblaciones del fichero cuyo nombre se pasa como parámetro. Si el fichero no existe o
  360. *  hay algún tipo de excepción devuelve false y crea un almacén vacío. Si lo recupera, devuelve true.
  361. * @param lectura - Nombre del archivo que leeremos
  362. */
  363. public boolean recuperar(String lectura) {
  364. ObjectInputStream entrada = null;
  365. try{
  366. entrada = new ObjectInputStream (new FileInputStream (lectura));
  367. @SuppressWarnings("unchecked")
  368. Map<String, SortedSet<IPoblacion>> Aprovincias2 = (Map<String, SortedSet<IPoblacion>>) entrada.readObject();
  369. System.out.println(Aprovincias2.entrySet());
  370. }catch(Exception e){
  371. e.printStackTrace();
  372. }
  373. finally{
  374. if(entrada!=null)
  375. try{
  376. entrada.close();
  377. System.out.println("Recuperado");
  378. return true;
  379. }catch (IOException e){
  380. e.printStackTrace();
  381. }
  382. }
  383. return false;
  384. }
  385.  
  386. /**
  387. * Clase para comparar las poblaciones por nombre
  388. * @author kikian
  389. *
  390. */
  391. class porNombre implements Comparator<IPoblacion>{
  392. @Override
  393. public int compare(IPoblacion o1, IPoblacion o2) {
  394. return o1.getNombre().compareTo(o2.getNombre());
  395. }
  396.  
  397. }
  398.  
  399. /**
  400. * Obtiene el codigo AEMET asociado a la poblacion
  401. */
  402. public String getCodigoAEMET() {
  403. // TODO Auto-generated method stub
  404. return null;
  405. }
  406.  
  407. }
  408.  

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

y al ejecutarlo se abre la ventana del programa y en eclipse me aparece esto:

[Madrid=[Getafe,0,Madrid], Galicia=[], Gralicia=[], Graliscia=[], Garlicia=[]]
Recuperado
[]
Gracias por utilizar nuestro programa

por lo que si se recupera el archivo pero luego cuando hago System.out.println(almacen.getProvincias()); para ver si realmente esta ahi metido el almacen me dice que esta vacio, ya que el metodo recuperar solo muestra el que se ha recuperado y no lo mete en ningun sitio, ¿Como meto lo que leo del archivo a la instacia de almacenPoblaciones?


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 21 Marzo 2015, 13:12 pm
Investiga por tu cuenta tambié... Un poco más abajo en otros temas he puesto códigos para leer ficheros. Échales un vistazo y aplícalo a tu aplicación.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 22 Marzo 2015, 13:42 pm
Investiga por tu cuenta tambié... Un poco más abajo en otros temas he puesto códigos para leer ficheros. Échales un vistazo y aplícalo a tu aplicación.
tambien investigo por mi cuenta pero no entiendo la forma de hacerlo, el profesor nos dijo que habia que pasar los parametros por referencia para que el almacen de poblaciones se guardara correctamente pero he mirado y en java no se pueden pasar parametros por referencia, todos son por valor.
Tambien sigo sin poder acceder a los botones crear y cancelar de provincias, se crea la ventana pero no hace nada al presionar.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 22 Marzo 2015, 21:09 pm
En Java, NO EXISTE EL PASO DE PARÁMETROS POR REFERENCIA, TODO PASO ES POR VALOR, pero un "paso por valor" muy especial y es muy confuso entenderlo. Intentaré explicártelo ;) (disculpa si lo hago más confuso :xD).

Imaginemos el siguiente escenario:

Tenemos una clase Dog:

Código
  1. public class Dog {
  2.    private String name;
  3.  
  4.    public Dog() {
  5.  
  6.    }
  7.  
  8.    public Dog(String name) {
  9.        this.name = name;
  10.    }
  11.  
  12.    public String getName() {
  13.        return name;
  14.    }
  15.  
  16.    public void setName(String name) {
  17.        this.name = name;
  18.    }
  19.  
  20. }

Y el main:

Código
  1. public class DogMain {
  2.  
  3.    public static void main(String[] args) {
  4.        Dog aDog = new Dog();
  5.        aDog.setName("Rex");
  6.        System.out.println("Nombre del perro: "+aDog.getName());
  7.        changeDogName(aDog);
  8.        System.out.println("Nombre del perro: "+aDog.getName());
  9.        changeDogReference(aDog);
  10.        System.out.println("Nombre del perro al terminar las operaciones: "+aDog.getName());
  11.    }
  12.  
  13.    public static void changeDogName(Dog sameDog) {
  14.        sameDog.setName("Brutus");
  15.        System.out.println("Cambiado el nombre del perro a 'Brutus'");
  16.    }
  17.    public static void changeDogReference(Dog sameDog) {
  18.        sameDog = new Dog("Fury");
  19.        System.out.println("Nuevo nombre del perro: "+sameDog.getName());
  20.    }
  21. }

Ahora, analicemos que hace el código.

1. Crea un objeto tipo Dog llamado aDog.
2. Establece el nombre de aDog a "Rex".
3. Imprime el nombre del perro (Rex).
4. Llama al método changeDogName y se le pasa aDog.
    Dentro de changeDogName:
    4.1 Cambia el nombre a aDog a "Brutus".
    4.2 Informa que se ha cambiado el nombre de aDog a "Brutus".
5. Imprime el nombre de aDog (Brutus).
6. Llama al método changeDogReference y se le pasa aDog.
    Dentro de changeDogReference:
    6.1 Instancia nuevamente aDog pasándole el nuevo nombre "Fury".
    6.2 Informa que se ha cambiado el nombre de aDog a "Fury".
7. Imprime el nombre final del aDog. El resultado es "Brutus".

Cuando le pasas un objeto por parámetro a un método, el objeto no pasa al método. Cuando pasas un objeto por parámetro a un método lo que ocurre es que se pasa es una copia de la dirección de memoria de dicho objeto. Por ende, no se puede modificar la referencia (dirección) no puede modificarse, pero sí se puede modificar los valores que engloba dicha referencia.

Es por eso que cuando hacemos:

Código
  1. public static void changeDogName(Dog sameDog) {
  2.        sameDog.setName("Brutus");
  3.        System.out.println("Cambiado el nombre del perro a 'Brutus'");
  4.    }

Cambia el nombre de aDog sin problema alguno, porque puede acceder a los valores por medio de la copia de la dirección de memoria de aDog.

Pero, ¿Qué pasa si volvemos a instanciar aDog dentro de un método? El resultado es que esa copia de la dirección de memoria de aDog recibe una nueva dirección de memoria al instanciar Dog, por lo que ahora es otro objeto tipo Dog.

Código
  1. public static void changeDogReference(Dog sameDog) {
  2.        sameDog = new Dog("Fury");
  3.        System.out.println("Nuevo nombre del perro: "+sameDog.getName());
  4.    }

Para comprobarlo, ejecutemos la prueba:

Citar
Nombre del perro: Rex
Cambiado el nombre del perro a 'Brutus'
Nombre del perro: Brutus
Nuevo nombre del perro: Fury
Nombre del perro al terminar las operaciones: Brutus

Como ves, el paso de variables en Java es por VALOR y NO POR REFERENCIA. Puedes llevarle éste ejemplo a tu profesor, para que vea que está equivocado.


Saludos.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 27 Marzo 2015, 18:29 pm
hola, ya he resuelto bastantes errores, puedo añadir y eliminar provincias perfectamente, ahora lo que necesito es que en la lista de provincias al pinchar en una, por ejemplo en madrid y darle al boton crear poblacion,me salga un frame en el que me diga que voy a añadir en la provincia madrid la poblacion xxxx, estoy utilizando el metodo lista.getSelectedItem() para saber que elemtno esta pinchado pero me salta null pointer exception y no se porque, mira:
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.WindowAdapter;
  15. import java.awt.event.WindowEvent;
  16.  
  17. import principal.AlmacenPoblaciones;
  18. import principal.Aviso;
  19.  
  20. public class VentanaCrearPoblacion extends Dialog {
  21.  
  22. private Button crear;
  23. private Button cancelar;
  24. private AlmacenPoblaciones almacen;
  25. private List listaPoblaciones;
  26. private List listaPredicciones;
  27. private List listaProvincias;
  28. private TextField textField;
  29. private static final long serialVersionUID = 1434307119439314094L;
  30.  
  31. public VentanaCrearPoblacion(Frame gui, AlmacenPoblaciones almacen, List listaPoblaciones, List listaProvincias, List listaPredicciones) {
  32. super(gui);
  33. initComponents(gui);
  34. this.almacen = almacen;
  35. this.listaPoblaciones = listaPoblaciones;
  36. this.listaProvincias = listaProvincias;
  37. this.listaPredicciones = listaPredicciones;
  38. }
  39. public void initComponents(Frame gui){
  40. setLocationRelativeTo(gui);
  41. this.setLayout(new BorderLayout());
  42. this.setTitle("Crear Poblacion");
  43. this.setSize(300, 200);
  44. Panel texto = new Panel(new GridLayout(4,1,0,0));
  45. Panel panel = new Panel(new FlowLayout());
  46. crear = new Button("Crear");
  47. cancelar = new Button("Cancelar");
  48. textField = new TextField("Nombre");
  49. Label nombreP = new Label(listaProvincias.getSelectedItem());
  50. TextField habitantes = new TextField("Habitantes");
  51. TextField codigo = new TextField("CodigoAEMET");
  52. crear.addActionListener(new Controller());
  53. cancelar.addActionListener(new Controller());
  54.  
  55. texto.add(textField);
  56. texto.add(nombreP);
  57. texto.add(habitantes);
  58. texto.add(codigo);
  59. panel.add(crear);
  60. panel.add(cancelar);
  61.  
  62. this.add(texto, BorderLayout.CENTER);
  63. this.add(panel,BorderLayout.SOUTH);
  64.  
  65. addWindowListener (new WindowAdapter (){
  66.          public void windowClosing(WindowEvent e) {
  67.          VentanaCrearPoblacion.this.dispose();
  68.             }
  69.          });
  70. }
  71. class Controller implements ActionListener {
  72. private VentanaCrearPoblacion gui;
  73. public void actionPerformed(ActionEvent e) {
  74. String label = e.getActionCommand();
  75. if(label.equals("Crear")){
  76. System.out.println("hola");
  77. try{
  78.  
  79. Aviso aviso = new Aviso(gui,e1.getMessage());
  80. }
  81. }else{
  82. VentanaCrearPoblacion.this.dispose();
  83. }
  84. }
  85. }
  86.  
  87. }
  88.  

he metido el controller dentro de la clase ventana por que me lo ha dicho el profesor


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 27 Marzo 2015, 19:00 pm
Necesitas hacer algunos cambios. Por ejemplo:

Código
  1. @Override
  2. public void actionPeformed(ActionEvent evt) {
  3.    String target = evt.getActionCommand();
  4.    switch(target.toLowerCase()) {
  5.        case "crear población": createPopulation(evt); break;
  6.        case "añadir provincia": createProvince(evt); break;
  7.    }
  8. }
  9.  
  10. private void createPopulation(ActionEvent evt) {
  11.    // listProvinces viene a ser el JList que contiene las provincias
  12.    Province province = (Province) listProvinces.getSelectedItem();
  13.    NewPopulationDialog dialog = new NewPopulationDialog();
  14.    // obtiene el controlador de la vista NewPopulationDialog
  15.    NewPopulationDialogCtrl controller = dialog.getController();
  16.    // le pasa al controlador la provincia a la cual se le
  17.    // agregará la población
  18.    controller.setProvinceTargered(province);
  19.    dialog.setVisible(true);
  20. }

Y en el controlador de NewPopulationDialog:

Código
  1. public class NewPopulationDialogCtrl {
  2.    private NewPopulationDialog gui;
  3.    private String province;
  4.  
  5.    public NewPopulationDialogCtrl(NewPopulationDialog gui) {
  6.        this.gui = gui;
  7.    }
  8.  
  9.    public String getProvinceTarget() {
  10.        return province;
  11.    }
  12.  
  13.    public setProvinceTarget(String province) {
  14.        this.province = province;
  15.    }
  16.  
  17.    /* En la vista obtenemos los datos de la nueva población
  18.         y los asignamos a un objeto Population que se le pasa
  19.         por parámetro a addPopulation para que lo guarde en el Map */
  20.    public void addPopulation(Population) {
  21.  
  22.    }
  23.  
  24.    // otros métodos...
  25.  
  26. }

La vista NewPopulationDialog, debe asignar el nombre de la provincia en el label así:

Código
  1. label.setText(controller.getProvinceTarget());


Saludos.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 27 Marzo 2015, 19:24 pm
(http://i.imgur.com/fSB2k1T.png)
eso es lo que debe de salir, me sale todo menos donde estan los guiones que tiene que ir la provincia seleccionada

esta es la clase 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. }
  50. //Imprimimos provincias y poblaciones en las listas
  51. }
  52.  
  53. public AlmacenPoblaciones RecuperarAlmacenPoblaciones() {
  54. // Recuperamos el almacén
  55. AlmacenPoblaciones almacenPoblaciones1 = new AlmacenPoblaciones();
  56.  
  57. if (almacenPoblaciones1.recuperar(FICHERO))
  58. System.out.println("Recuperado el almacen del fichero " + FICHERO);
  59. else
  60. System.out.println("No se pudo recuperar el almacen del fichero "+ FICHERO);
  61. return almacenPoblaciones1;
  62.  
  63. }
  64.  
  65. private void initComponents() {
  66.  
  67. // Boton salir por defecto
  68. addWindowListener(new WindowAdapter() {
  69. public void windowClosing(WindowEvent e) {
  70. guardarAntesDeSalir();
  71. System.exit(0);
  72. }
  73. });
  74.  
  75. setMenuBar(addMenuBar());
  76. this.add(addToolBar(), BorderLayout.NORTH);
  77. this.add(addlineaEstado(), BorderLayout.SOUTH);
  78. this.add(addPanelIzquierda(), BorderLayout.WEST);
  79. this.add(addpredicciones(), BorderLayout.CENTER);
  80. }
  81.  
  82. private MenuBar addMenuBar() {
  83. // Sitúo los menús desplegables
  84. MenuBar barraDeMenu = new MenuBar();
  85.  
  86. // Creo el menú Archivo
  87. Menu menuArchivo = new Menu("Archivo");
  88. MenuItem crearGuardar = new MenuItem("Guardar");
  89. MenuItem crearCargar = new MenuItem("Cargar");
  90. MenuItem salir = new MenuItem("Salir");
  91. crearCargar.addActionListener(new Controller());
  92. crearGuardar.addActionListener(new Controller());
  93. salir.addActionListener(new Controller());
  94. menuArchivo.add(crearCargar);
  95. menuArchivo.add(crearGuardar);
  96. menuArchivo.add(salir);
  97.  
  98. // Creo el menú Provincias
  99. Menu menuProvincias = new Menu("Provincias");
  100. MenuItem crearProvincias = new MenuItem("Crear provincia");
  101. MenuItem borrarProvincias = new MenuItem("Borrar provincia");
  102. crearProvincias.addActionListener(new Controller());
  103. borrarProvincias.addActionListener(new Controller());
  104. menuProvincias.add(crearProvincias);
  105. menuProvincias.add(borrarProvincias);
  106.  
  107. // Creo el menu Poblaciones
  108. Menu menuPoblaciones = new Menu("Poblaciones");
  109. MenuItem crearPoblacion = new MenuItem("Crear poblacion");
  110. MenuItem borrarPoblacion = new MenuItem("Borrar poblacion");
  111. MenuItem ordenarNombre = new MenuItem("Ordenar por nombre");
  112. MenuItem ordenarHabitantes = new MenuItem("Ordenar por habitantes");
  113. MenuItem modPoblacion = new MenuItem("Modificar poblacion");
  114. MenuItem movPoblacion = new MenuItem("Mover poblacion");
  115. crearPoblacion.addActionListener(new Controller());
  116. borrarPoblacion.addActionListener(new Controller());
  117. ordenarNombre.addActionListener(new Controller());
  118. ordenarHabitantes.addActionListener(new Controller());
  119. modPoblacion.addActionListener(new Controller());
  120. movPoblacion.addActionListener(new Controller());
  121. menuPoblaciones.add(crearPoblacion);
  122. menuPoblaciones.add(borrarPoblacion);
  123. menuPoblaciones.add(ordenarNombre);
  124. menuPoblaciones.add(ordenarHabitantes);
  125. menuPoblaciones.add(modPoblacion);
  126. menuPoblaciones.add(movPoblacion);
  127.  
  128. // Creo el menú de ayuda
  129. Menu ayuda = new Menu("Ayuda");
  130. MenuItem acercaDe = new MenuItem("Acerca de");
  131. acercaDe.addActionListener(new AcercaDe());
  132. ayuda.add(acercaDe);
  133.  
  134. // Crea el
  135. barraDeMenu.add(menuArchivo);
  136. barraDeMenu.add(menuProvincias);
  137. barraDeMenu.add(menuPoblaciones);
  138. // Sitúo el menú de ayuda en su sitio
  139. barraDeMenu.setHelpMenu(ayuda);
  140. return barraDeMenu;
  141. }
  142.  
  143. private Panel addToolBar() {
  144. // Sitúo la línea de botones
  145. Panel lineaDeBotones = new Panel(new FlowLayout(FlowLayout.LEFT));
  146. lineaDeBotones.setBackground(Color.lightGray);
  147.  
  148. // Boton crear provincia
  149. Button proCrear = new Button("Crear provincia");
  150. proCrear.addActionListener(new Controller());
  151.  
  152. // Boton crear poblacion
  153. Button poCrear = new Button("Crear poblacion");
  154. poCrear.addActionListener(new Controller());
  155.  
  156. // Boton actualizar prediccion
  157. Button aPrediccion = new Button("Actualizar Predicción");
  158. aPrediccion.addActionListener(new Controller());
  159.  
  160. // Añadir los botones a la barra
  161. lineaDeBotones.add(proCrear);
  162. lineaDeBotones.add(poCrear);
  163. lineaDeBotones.add(aPrediccion);
  164. return lineaDeBotones;
  165. }
  166.  
  167. private Panel addPanelIzquierda() {
  168. // Creamos panel para mostrar provincias y poblaciones y lo colocamos a
  169. // la izquierda
  170. Panel izquierda = new Panel(new GridLayout(4, 1));
  171. Label lProvincia = new Label("Provincias:");
  172. Label lPoblacion = new Label("Poblaciones:");
  173. izquierda.add(lProvincia);
  174. izquierda.add(listaProvincias);
  175. izquierda.add(lPoblacion);
  176. izquierda.add(listaPoblaciones);
  177. return izquierda;
  178. }
  179.  
  180. private Panel addpredicciones() {
  181. // Creamos el panel de las predicciones
  182. Panel predicciones = new Panel(new BorderLayout());
  183. Label lPrediccion = new Label("Predicciones de :");
  184. List tPrediccion = new List();
  185. predicciones.add(lPrediccion, BorderLayout.NORTH);
  186. predicciones.add(tPrediccion, BorderLayout.CENTER);
  187. return predicciones;
  188. }
  189.  
  190. private Panel addlineaEstado() {
  191. // Sitúo la línea de estado
  192. Panel lineaDeEstado = new Panel();
  193. lineaDeEstado.setLayout(new FlowLayout(FlowLayout.LEFT));
  194. lineaDeEstado.setBackground(Color.lightGray);
  195. Label ventanaDeeventos = new Label("Gestor AEMET v1.0 (PAA)");
  196. lineaDeEstado.add(ventanaDeeventos);
  197. return lineaDeEstado;
  198. }
  199.  
  200. private void guardarAntesDeSalir() {
  201.  
  202. // Guardar almacen
  203. almacen.guardar(FICHERO);
  204. System.out.println("Gracias por utilizar nuestro programa");
  205. }
  206.  
  207. class Controller implements ActionListener {
  208.  
  209. public void actionPerformed(ActionEvent e) {
  210. String nombre = e.getActionCommand();
  211. EvaluarAccion(nombre);
  212. }
  213.  
  214. public void EvaluarAccion(String accion) {
  215.  
  216. switch (accion) {
  217. case "Guardar":
  218. almacen.guardar(FICHERO);
  219. Aviso guardar = new Aviso(gui, "Archivo guardado");
  220. break;
  221. case "Salir":
  222. System.exit(0);
  223. break;
  224. case "Crear provincia":
  225. new VentanaCrearProvincia(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
  226. break;
  227. case "Borrar provincia":
  228. new VentanaBorrarProvincia(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
  229. break;
  230. case "Crear poblacion":
  231. new VentanaCrearPoblacion(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
  232. break;
  233. case "Borrar poblacion":
  234. new VentanaBorrarPoblacion(gui,almacen,listaPoblaciones,listaProvincias,listaPredicciones).setVisible(true);
  235. break;
  236. case "Ordenar por nombre":
  237. break;
  238. case "Ordenar por habitantes":
  239. break;
  240. case "Modificar poblacion":
  241. break;
  242. case "Mover poblacion":
  243. break;
  244. }
  245. }
  246. }
  247.  
  248. /**
  249. * Clase que implementa la acción del menú "acerca de".
  250. */
  251. class AcercaDe implements ActionListener { // Clase interna
  252. public void actionPerformed(ActionEvent e) {
  253. VentanaAcercaDe ventanaAcercaDe = new VentanaAcercaDe(
  254. InterfazAWT_AEMET.this);
  255. ventanaAcercaDe.setVisible(true);
  256. }
  257. }// Acerca de
  258.  
  259. /**
  260. * Método main.
  261. * @throws GestorAEMETException
  262. */
  263. public static void main(String[] args) throws GestorAEMETException {
  264.  
  265. InterfazAWT_AEMET mimarco = new InterfazAWT_AEMET("Gestor AEMET", 1000,
  266. 500);
  267. mimarco.setVisible(true);
  268. } // Main
  269. }
  270.  

y esta la que se encarga de crear 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 principal.AlmacenPoblaciones;
  19. import principal.Aviso;
  20.  
  21. public class VentanaCrearPoblacion extends Dialog {
  22.  
  23. private Button crear;
  24. private Button cancelar;
  25. private AlmacenPoblaciones almacen;
  26. private List listaPoblaciones;
  27. private List listaPredicciones;
  28. private List listaProvincias;
  29. private TextField textField;
  30. private static final long serialVersionUID = 1434307119439314094L;
  31.  
  32. public VentanaCrearPoblacion(Frame gui, AlmacenPoblaciones almacen, List listaPoblaciones, List listaProvincias, List listaPredicciones) {
  33. super(gui);
  34. initComponents(gui);
  35. this.almacen = almacen;
  36. this.listaPoblaciones = listaPoblaciones;
  37. this.listaProvincias = listaProvincias;
  38. this.listaPredicciones = listaPredicciones;
  39. }
  40. public void initComponents(Frame gui){
  41. setLocationRelativeTo(gui);
  42. this.setLayout(new BorderLayout());
  43. this.setTitle("Crear Poblacion");
  44. this.setSize(300, 200);
  45. Panel texto = new Panel(new GridLayout(4,1,0,0));
  46. Panel panel = new Panel(new FlowLayout());
  47. crear = new Button("Crear");
  48. cancelar = new Button("Cancelar");
  49. textField = new TextField("Nombre");
  50. Label nombreP = new Label();
  51. String textoProvincia = listaProvincias.getSelectedItem();
  52. System.out.println(textoProvincia);
  53. nombreP.setText("");
  54. TextField habitantes = new TextField("Habitantes");
  55. TextField codigo = new TextField("CodigoAEMET");
  56. crear.addActionListener(new Controller());
  57. cancelar.addActionListener(new Controller());
  58.  
  59. texto.add(textField);
  60. texto.add(nombreP);
  61. texto.add(habitantes);
  62. texto.add(codigo);
  63. panel.add(crear);
  64. panel.add(cancelar);
  65.  
  66. this.add(texto, BorderLayout.CENTER);
  67. this.add(panel,BorderLayout.SOUTH);
  68.  
  69. addWindowListener (new WindowAdapter (){
  70.          public void windowClosing(WindowEvent e) {
  71.          VentanaCrearPoblacion.this.dispose();
  72.             }
  73.          });
  74. }
  75. class Controller implements ActionListener {
  76. private VentanaCrearPoblacion gui;
  77. public void actionPerformed(ActionEvent e) {
  78. String label = e.getActionCommand();
  79. if(label.equals("Crear")){
  80. System.out.println("hola");
  81. try{
  82.  
  83. Aviso aviso = new Aviso(gui,e1.getMessage());
  84. }
  85. }else{
  86. VentanaCrearPoblacion.this.dispose();
  87. }
  88. }
  89. }
  90. void listChange(ItemEvent ev) {
  91.        if((ev.getItem()).equals("Desayuno")){
  92.  
  93.        }
  94.    }
  95.  
  96. }
  97.  

este es el error que genera:

Código
  1. Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
  2. at Poblacion.VentanaCrearPoblacion.initComponents(VentanaCrearPoblacion.java:51)
  3. at Poblacion.VentanaCrearPoblacion.<init>(VentanaCrearPoblacion.java:34)
  4. at principal.InterfazAWT_AEMET$Controller.EvaluarAccion(InterfazAWT_AEMET.java:231)
  5. at principal.InterfazAWT_AEMET$Controller.actionPerformed(InterfazAWT_AEMET.java:211)
  6. at java.awt.Button.processActionEvent(Unknown Source)
  7. at java.awt.Button.processEvent(Unknown Source)
  8. at java.awt.Component.dispatchEventImpl(Unknown Source)
  9. at java.awt.Component.dispatchEvent(Unknown Source)
  10. at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
  11. at java.awt.EventQueue.access$500(Unknown Source)
  12. at java.awt.EventQueue$3.run(Unknown Source)
  13. at java.awt.EventQueue$3.run(Unknown Source)
  14. at java.security.AccessController.doPrivileged(Native Method)
  15. at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
  16. at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
  17. at java.awt.EventQueue$4.run(Unknown Source)
  18. at java.awt.EventQueue$4.run(Unknown Source)
  19. at java.security.AccessController.doPrivileged(Native Method)
  20. at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
  21. at java.awt.EventQueue.dispatchEvent(Unknown Source)
  22. at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
  23. at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
  24. at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
  25. at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
  26. at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
  27. at java.awt.EventDispatchThread.run(Unknown Source)
  28.  


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 27 Marzo 2015, 19:36 pm
El error es porque listaProvincias aún está null, ya que el método initComponents es ejecutado antes que se establezcan las propiedades con los valores de los parámetros.

El constructor debería ser así:

Código
  1. public VentanaCrearPoblacion(Frame gui, AlmacenPoblaciones almacen,
  2.    List listaPoblaciones, List listaProvincias, List listaPredicciones) {
  3.    super(gui);
  4.    this.almacen = almacen;
  5.    this.listaPoblaciones = listaPoblaciones;
  6.    this.listaProvincias = listaProvincias;
  7.    this.listaPredicciones = listaPredicciones;
  8.    initComponents(gui);
  9. }


Saludos.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: Usuario Invitado en 27 Marzo 2015, 21:02 pm
Perdón por el doble post, pero creo que así hay más probabilidades que el autor del tema me lea a que edite mi respuesta anterior.

Creo que ya es hora de cerrar éste tema, se ha desvirtuado mucho. Cualquier nueva duda kikian94, por favor abrirla en un nuevo tema. No olvides marcar este tema como solucionado.


Saludos.


Título: Re: Meter un Frame dentro de otro Frame
Publicado por: kikian94 en 28 Marzo 2015, 12:47 pm
si, tienes toda la razon, ya he conseguido solucionar el error, era por lo que decias :), muchas gracias por todo,que paciencia has tenido jeje