Encontré un ejemplo en el que se agregan botones a paneles (instancias de JPanel
) luego se agregan paneles a los contenedores (instancias generadas por getContentPane()
) y luego los contenedores son, por la construcción, incluidos en JFrame
(las ventanas).¿Cuál es la relación entre ContentPane y JPanel?
probé dos cosas:
que se deshizo de los contenedores. En más detalles, agregué botones a un panel (instancia de
JPanel
) y luego agregué el panel a las ventanas (instancia deJFrame
). Funcionó bienMe deshice de los paneles. En más detalles, agregué botones directamente al contenedor y luego agregué el contenedor a la ventana (instancia de
JFrame
).
Entonces, no entiendo dos cosas.
¿Por qué tenemos dos mecanismos que compiten para hacer las mismas cosas?
¿Cuál es el motivo para utilizar contenedores en combinación con los paneles (
JPanel
)? (Por ejemplo, para qué incluimos botones en JPanels y luego incluimos JPanels en los Contenedores). ¿Podemos incluirJPanel
enJPanel
? ¿Podemos incluir un contenedor en un contenedor?
añadido:
Tal esencia de mi pregunta se puede poner en una línea de código:
frame.getContentPane().add(panel);
Lo que para getContentPane()
ponemos en el medio? Intenté solo frame.add(panel);
y funciona bien.
añadieron 2:
me gustaría añadir algo de código para ser más claro acerca de lo que quiero decir. En este ejemplo utilizo solamente JPane:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JButton("W"), BorderLayout.NORTH);
panel.add(new JButton("E"), BorderLayout.SOUTH);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
Y en este ejemplo utilizo Panel única Contenido:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
Container pane = frame.getContentPane();
pane.setLayout(new BorderLayout());
pane.add(new JButton("W"), BorderLayout.NORTH);
pane.add(new JButton("E"), BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
Ambos funcionan bien! Solo quiero saber si entre estas dos formas de hacer las cosas, una es mejor (más segura).
@Nate, ¿qué quiere decir con "Internamente, está usando un JPanel". ¿Quieres decir que Container está usando un JPanel? ¿Qué quieres decir con eso? Pensé que JPanel es una subclase de Container. ¿Y qué puedo cambiar por "setContentPane"? DE ACUERDO. Usted dice que Container es una clase (y siempre consideré Container como clase). Pero JPane también es una clase. ¿Por qué no podemos usar solo JPane o simplemente Container?Pude hacer lo mismo usando solo JPane. También pude hacer lo mismo usando solo Contenedores. – Roman
'JFrame' utiliza internamente un objeto' JPanel' para respaldar el método 'getContentPane()'. Esta es la razón por la cual la respuesta de Zachary funciona. La referencia real de 'JPanel' está enterrada en el campo' JFrame.rootPane'. Llamarías a 'setContentPane()' en 'JFrame'; por ejemplo, podrías cambiar la línea 10 en tu primer ejemplo de' frame.add (panel) 'a' frame.setContentPane (panel) '. 'Container' es una clase. 'JPanel' es una clase (que es una subclase de' Container'). Está confundiendo el tipo de referencia con el tipo de objeto al que hace referencia la referencia. Piense en 'Container container = new JPanel()' – Nate
@Nate la fuente (http://pragmaticjava.blogspot.com.ar/2008/08/program-to-interface-not-implementation.html) ha sido eliminada. – Lucio