Java - Ayuda con la administración de componentes en un JFrame

 
Vista:
Imágen de perfil de Iraldo

Ayuda con la administración de componentes en un JFrame

Publicado por Iraldo (10 intervenciones) el 06/12/2015 20:25:38
Hola muy buenas.

Tengo problemas a la hora de configurar los paneles (o contenedores) dentro de una ventana (JFrame), debido a mi falta de conocimientos en POO, y el estar acostumbrado a programación tipo estructurada (no soy informático, solo industrial aficionado a la misma).

En mi programa, tengo una clase "Ventana" que se extiende de JFrame. El Layout es de tipo BorderLayout.

Por otro lado, tengo una clase que se extiende de JPanel, que pretende configurar lo que ocurre en el panel central de la Ventana ("BorderLayout.CENTER").

Para el resto de divisiones de la Ventana (NORTH, EAST...), la intención es que tengan una serie de botones que interactuen con lo que ocurre en el panel central.

Mi problema está en que estos botones tienen que ser dinámicos, o que se puedan configurar desde otras acciones. Más especificamente como uno de los problemas, en un botón JMenu, que los Items de este menú sean variables en función de otras acciones con otros botones.

Hasta ahora, lo había hecho con un 80% de programación estructurada (a lo bruto), pero creo que tengo que ir más hacia una programación orientada a objetos.

He intentado hacer una clase que extienda a JPanel para cada contenedor, pero me duplica los botones cada vez que interactuo con la ventana.

Soy consciente de mis limitaciones en POO, ya que solo llevo un par de meses con la misma.

Humildemente pido consejo al lector. Muchas gracias de antemano.

Saludos.

Iraldo.

Mi código tiene esta pinta:

CLASE VENTANA:

public class Frame extends JFrame implements ActionListener, ChangeListener{
Atributos
public Frame(){
...

pn=new PanelNorte();
pe=new PanelEste();
visualizador=new Panel();

//Configuración NORTH
panel.add(pn,BorderLayout.NORTH);
//Configuración EAST
panel.add(pe,BorderLayout.EAST);
//Configuración CENTER
panel.add(visualizador,BorderLayout.CENTER);

...
}
public ActionPerformed(){
//Eventos de los botones

}

}

CLASE PANEL:

public class Panel extends JPanel...{
...

public Panel(){
}
public void paintComponent(Graphics g){
}
public void run(){
}

...

}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con la administración de componentes en un JFrame

Publicado por Tom (1831 intervenciones) el 06/12/2015 22:16:33
Es difícil contestarte porque es difícil saber qué quieres hacer en realidad.

Me parece que necesitas algún tipo de clase "controlador" (ya sabes, model-view-controller es un patrón de diseño que se suele usar para aplicaciones gráficas).

En este ejemplo muy limitado, la clase "controlador" sería el propio JFrame (algo que también se suele hacer porque simplifica mucho) y no hay "modelo" de datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class TestFrame extends JFrame {
 
	/* */
	TestFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(new BorderLayout());
		add(topPanel(), BorderLayout.NORTH);
		add(centerPanel(), BorderLayout.CENTER);
		setMenuBar(new MenuBar());
		getMenuBar().add(new Menu("Test Menu"));
		getMenuBar().getMenu(0).add("Now Empty");
 
		pack();
	}
	/* */
	JPanel centerPanel() {
		JPanel res = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));
		JButton btLeft = new JButton();
		JButton btRight = new JButton();
 
		btLeft.setAction(new AbstractAction("Set Menu type 1") {
			@Override
			public void actionPerformed(ActionEvent e) {
				Menu mainMenu = getMenuBar().getMenu(0);
				mainMenu.removeAll();
				mainMenu.add("Type1 - action 1");
				mainMenu.add("Type1 - action 2");
			}
		});
		btRight.setAction(new AbstractAction("Set Menu type 2") {
			@Override
			public void actionPerformed(ActionEvent e) {
				Menu mainMenu = getMenuBar().getMenu(0);
				mainMenu.removeAll();
				mainMenu.add("Type2 - action 1");
				mainMenu.add("Type2 - action 2");
				mainMenu.add("Type2 - action 3");
			}
		});
		res.add(btLeft);
		res.add(btRight);
 
		return res;
	}
	JPanel topPanel() {
		JPanel res = new JPanel(new BorderLayout());
		return res;
	}
	/* */
	public static void main(String args[]) {
		new TestFrame().setVisible(true);
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar
Imágen de perfil de Iraldo

Ayuda con la administración de componentes en un JFrame

Publicado por Iraldo (10 intervenciones) el 06/12/2015 22:28:48
Muchas gracias por tu aporte Tom.
Me pondré a ello a ver que tal va.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 80
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda con la administración de componentes en un JFrame

Publicado por Juan R. (108 intervenciones) el 07/12/2015 01:19:46
Buenas Iraldo

Lo que te dice Tom es lo que debes ver e investigar. Ya si quieres tenerlos para que queden algo más ordenados, puedes crear paneles dentro del JFrame y hacer que se creen allí, de manera que los tendrás digamos "más encerrados".

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Iraldo

Ayuda con la administración de componentes en un JFrame

Publicado por Iraldo (10 intervenciones) el 07/12/2015 01:38:40
Muchas gracias Juan.

Me interesa mucho esa vía. Lo que a la hora de relacionar lo que pasa entre los subpaneles del Frame me lio .. =/. Estaba intentando hacer una clase para cada subpanel..quizás me esté liando.

Te refieres a declarar como atributos objetos JPanel? Para luego seguir configurarndolos dentro de la clase Frame?

Gracias de antemano.

Iraldo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 80
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda con la administración de componentes en un JFrame

Publicado por Juan R. (108 intervenciones) el 07/12/2015 16:30:28
Buenas de nuevo

Exactamente. Puedes tener dentro de tu frame los paneles que quieras. Es más, yo en una TPV tengo declarados dos paneles que se actualizan en ejecución (uno con familias de productos y otro con los propios productos). Lo único que tienes que hacer es declarar como atribulo el JPanel y después ir agregándole, según tus condiciones los botones, por ejemplo, yo lo hago de la siguiente manera:

botones


Te explico el código:

Lo que ves es la función que cargaría los botones. En tu frame tendrías que tener declarado un JPanel (yo suelo utilizar el método cada objeto tiene una vista, una acción y una ejecución SQL, este código corresponde a la ejecución SQL) y al llegar a la opción de ejecución tirar de dicho JPanel.

Después crearía la consulta para traerme todos los registros de la tabla familias y después a cada registro le asignaría un botón, como puedes observar le puedes dar nombres dinámicamente sin problemas a los distintos botones e incluso podrías crear la acción que ocurra según diversas condiciones, en mi caso llamo al método que me carga los botones de productos a raíz de ésta.

Por último añades el botón al panel y lo actualizas (la opción UpdateUI() sirve para ello).

Un saludo y espero haberte ayudado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Iraldo

Ayuda con la administración de componentes en un JFrame

Publicado por Iraldo (10 intervenciones) el 07/12/2015 17:19:37
Muchas gracias Juan.

Tiene muy buena pinta.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 80
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Ayuda con la administración de componentes en un JFrame

Publicado por Juan R. (108 intervenciones) el 07/12/2015 23:55:16
Ya contarás como te fue.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Iraldo

Ayuda con la administración de componentes en un JFrame

Publicado por Iraldo (10 intervenciones) el 08/12/2015 23:57:47
Hola Juan muy buenas.

Al final conseguí más o menos el "cargar botones" en función de un fichero. Échale un vistazo si quieres más abajo. Cualquier comentario será bien recibido.

Muchas gracias por los aportes. Me ayudaron enormemente.

Saludos.

Iraldo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
cargarZona.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                Object[] opciones={"Crear nuevo archivo","Zonas guardadas"};
                int seleccion;
                seleccion = JOptionPane.showOptionDialog(null,"¿Qué desea hacer?","Opciones",JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE,null,opciones,null);
                if(seleccion==JOptionPane.YES_OPTION){
                    String texto=JOptionPane.showInputDialog(null,"Escriba el nombre del nuevo archivo");
                    try {
                        nombreArchivo=texto;
                        FileWriter archivoNuevo=new FileWriter("C:\\ArchivosLectura\\ZonasGuardadas\\"+nombreArchivo+".txt");
 
                    } catch (IOException ex) {
                        Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
                    }
 
                }else{
 
                    nombreArchivo= JOptionPane.showInputDialog(null, "Escriba el nombre de la zona");
                    try {
                       ArrayList<Zona> areas=LeerZonasDesdeArchivo(nombreArchivo);
                       for(int i=0;i<areas.size();i++){
                           int temp=i+1;
                           JMenuItem Item = new JMenuItem(areas.get(i).nombreZona);
                           Item.addActionListener(new ActionListener(){
 
                               @Override
                               public void actionPerformed(ActionEvent e){
 
                                   try {
                                       visualizador.PintarZona(temp,nombreArchivo);
                                   } catch (IOException ex) {
                                       Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
                                   }
                               }
                           });
                           Areas.add(Item);
                       }
                       mb.add(Areas);
                       panelOeste.add(mb);
                       panelOeste.updateUI();//Actualizo el contenedor
                    } catch (IOException ex) {
                        Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar