Meter un Frame dentro de otro Frame

Iniciado por kikian94, 12 Marzo 2015, 19:35 PM

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

kikian94

Hola, tengo que crear una aplicacion que de informacion sobre el tiempo y necesito crear esto:


y necesito esto:



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

Usuario Invitado

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

kikian94

#2
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

Usuario Invitado

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.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

kikian94

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

Usuario Invitado

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.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

kikian94

#6
He probado con el panel, y si funciona pero tengo un problema no se alinear los elementos, he creado un box layout:
Código (java) [Seleccionar]
Panel izquierda = new Panel(new GridLayout(4,1));

Label lProvincia = new Label("Provincias:");
List tProvincias = new List();
Label lPoblacion = new Label("Poblaciones:");
List tPoblaciones = new List();

izquierda.add(lProvincia);
izquierda.add(tProvincias);
izquierda.add(lPoblacion);
izquierda.add(tPoblaciones);


add (izquierda, BorderLayout.WEST);



Usuario Invitado

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.

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.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

kikian94

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

Usuario Invitado

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 (java) [Seleccionar]
package com.company.app.views;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import com.company.app.controllers.MainWindowController;
import com.company.app.model.entities.Population;

public class MainWindow extends JFrame {
private static final long serialVersionUID = -2973563217322489640L;
private JMenuItem iOpen;
private JMenuItem iExit;
private JMenuItem iNewProvince;
private JMenuItem iUpdateProvince;
private JMenuItem iNewPopulation;
private JMenuItem iUpdatePopulation;
private JMenuItem iAbout;
private JButton btnUpdatePrediction;
private JButton btnNewProvince;
private JButton btnNewPopulation;
private JList<String> provinceList;
private JList<Population> populationList;
private JLabel lblFooter;
private MainWindowController controller;

public MainWindow() {
super();
controller = new MainWindowController(this);
initComponents();
}

private void initComponents() {
this.setLayout(new BorderLayout(10,10));

JPanel top = new JPanel(new BorderLayout());
top.setLayout(new GridLayout(2,1,0,0));
top.add(addMenuBar());
top.add(addToolbar());
this.add(BorderLayout.NORTH, top);
JPanel center = new JPanel(new BorderLayout(10,10));
center.add(BorderLayout.WEST, addProvincesPanel());
center.add(BorderLayout.CENTER, addPredictionsPanel());
this.add(BorderLayout.CENTER, center);
this.add(BorderLayout.SOUTH, addFooterPanel());

this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JFrame.setDefaultLookAndFeelDecorated(true);
this.setTitle("Sistema metereológico");
this.setSize(800,600);
try {
UIManager.setLookAndFeel(
        UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}

}

private JMenuBar addMenuBar() {
JMenuBar menubar = new JMenuBar();
menubar.setBackground(new Color(50,50,50));

JMenu menuFile = new JMenu("Archivo");
menuFile.setForeground(Color.WHITE);
iOpen = new JMenuItem("Abrir...");
iOpen.addActionListener(controller);
iExit = new JMenuItem("Salir");
iExit.addActionListener(controller);
menuFile.add(iOpen);
menuFile.add(iExit);

JMenu menuProvince = new JMenu("Provincias");
menuProvince.setForeground(Color.WHITE);
iNewProvince = new JMenuItem("Nueva provincia");
iNewProvince.addActionListener(controller);
iUpdateProvince = new JMenuItem("Actualizar provincia");
iUpdateProvince.addActionListener(controller);
menuProvince.add(iNewProvince);
menuProvince.add(iUpdateProvince);

JMenu menuPopulation = new JMenu("Poblaciones");
menuPopulation.setForeground(Color.WHITE);
iNewPopulation = new JMenuItem("Nueva población");
iNewPopulation.addActionListener(controller);
iUpdatePopulation = new JMenuItem("Actualizar población");
iUpdatePopulation.addActionListener(controller);
menuPopulation.add(iNewPopulation);
menuPopulation.add(iUpdatePopulation);

JMenu menuAbout = new JMenu("Ayuda");
menuAbout.setForeground(Color.WHITE);
iAbout = new JMenuItem("Acerca...");
iAbout.addActionListener(controller);
menuAbout.add(iAbout);

menubar.add(menuFile);
menubar.add(menuProvince);
menubar.add(menuPopulation);
menubar.add(menuAbout);

return menubar;
}

private JPanel addToolbar() {
JPanel toolbar = new JPanel(new FlowLayout(FlowLayout.LEFT));
toolbar.setBackground(new Color(0,184,255));
toolbar.setSize(50,100);
btnUpdatePrediction = new JButton("Actualizar predicción");
btnUpdatePrediction.setFocusable(false);
btnUpdatePrediction.addActionListener(controller);
btnNewProvince = new JButton("Nueva provincia");
btnNewProvince.setFocusable(false);
btnNewProvince.addActionListener(controller);
btnNewPopulation = new JButton("Nueva población");
btnNewPopulation.setFocusable(false);
btnNewPopulation.addActionListener(controller);

toolbar.add(btnUpdatePrediction);
toolbar.add(btnNewProvince);
toolbar.add(btnNewPopulation);

return toolbar;
}

private JPanel addProvincesPanel() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();

provinceList = new JList<>();
populationList = new JList<>();

constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(new JLabel("Provincias"), constraints);

constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.weighty = 1.0;
constraints.fill = GridBagConstraints.BOTH;
panel.add(new JScrollPane(provinceList), constraints);


constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 2;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(new JLabel("Poblaciones"), constraints);

constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 3;
constraints.gridwidth = 2;
constraints.gridheight = 1;
constraints.weighty = 1.0;
constraints.fill = GridBagConstraints.BOTH;
panel.add(new JScrollPane(populationList), constraints);

return panel;
}

private JPanel addPredictionsPanel() {
JPanel panel = new JPanel(new BorderLayout());
JLabel provinceName = new JLabel("Predicciones para ");
JTextArea textArea = new JTextArea();
textArea.setEditable(false);
panel.add(BorderLayout.NORTH, provinceName);
panel.add(BorderLayout.CENTER, new JScrollPane(textArea));

return panel;
}

private JPanel addFooterPanel() {
JPanel panel = new JPanel();
panel.setBackground(new Color(80,80,80));
lblFooter = new JLabel("Sistema metereológico");
lblFooter.setForeground(new Color(200,200,200));
panel.add(lblFooter);

return panel;
}

}


MainWindowController.java

Código (java) [Seleccionar]
package com.company.app.controllers;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import com.company.app.views.MainWindow;
import com.company.app.views.NewProvinceDialog;

public class MainWindowController implements ActionListener {
private MainWindow gui;

public MainWindowController(MainWindow gui) {
this.gui = gui;
}

@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Nueva provincia")) {
NewProvinceDialog dialog = new NewProvinceDialog(gui);
dialog.setVisible(true);
}
}

}


NewProvinceDialog.java

Código (java) [Seleccionar]
package com.company.app.views;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class NewProvinceDialog extends JDialog {
private static final long serialVersionUID = -3369879094143739366L;
private JTextField txtProvince;
private JButton btnAddProvince;

public NewProvinceDialog(JFrame parent) {
super(parent);
initComponents(parent);
}

private void initComponents(JFrame parent) {
JPanel panel = new JPanel(new GridBagLayout());
JLabel label = new JLabel("Nombre de la provincia:");
txtProvince = new JTextField();
btnAddProvince = new JButton("Agregar");

GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weighty = 1.0;
panel.add(label, constraints);

constraints = new GridBagConstraints();
constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 3;
constraints.gridheight = 1;
constraints.weightx = 1.0;
constraints.fill = GridBagConstraints.HORIZONTAL;
panel.add(txtProvince, constraints);

constraints = new GridBagConstraints();
constraints.gridx = 3;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.anchor = GridBagConstraints.EAST;
panel.add(btnAddProvince, constraints);

this.add(panel);
this.setTitle("Agregar nueva provincia");
this.setSize(280,100);
this.setModal(true);
this.setLocationRelativeTo(parent);
this.setResizable(false);

}

}


Imágenes:





Sólo es cosa de jugar con los layouts y delegar responsabilidades correctamente. Cualquier duda, comentas.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein