llamar - Java Swing: ¿cómo mostrar un panel en la parte superior de otro panel?
jpanel java netbeans (6)
Creo que LayeredPane es tu mejor apuesta aquí. Sin embargo, necesitaría un tercer panel para contener A y B. Este tercer panel sería el Panel estratificado y, a continuación, los paneles A y B aún podrían tener un bonito LayoutManagers. Todo lo que tendrías que hacer es centrar B sobre A y hay bastantes ejemplos en el sendero Swing sobre cómo hacer esto. Tutorial para posicionamiento sin un LayoutManager .
public class Main {
private JFrame frame = new JFrame();
private JLayeredPane lpane = new JLayeredPane();
private JPanel panelBlue = new JPanel();
private JPanel panelGreen = new JPanel();
public Main()
{
frame.setPreferredSize(new Dimension(600, 400));
frame.setLayout(new BorderLayout());
frame.add(lpane, BorderLayout.CENTER);
lpane.setBounds(0, 0, 600, 400);
panelBlue.setBackground(Color.BLUE);
panelBlue.setBounds(0, 0, 600, 400);
panelBlue.setOpaque(true);
panelGreen.setBackground(Color.GREEN);
panelGreen.setBounds(200, 100, 100, 100);
panelGreen.setOpaque(true);
lpane.add(panelBlue, new Integer(0), 0);
lpane.add(panelGreen, new Integer(1), 0);
frame.pack();
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Main();
}
}
Utiliza setBounds para colocar los paneles dentro del panel de capas y también para establecer sus tamaños.
Edite para reflejar los cambios en la publicación original. Deberá agregar detectores de componentes que detecten cuándo se cambia el tamaño del contenedor principal y luego cambiar dinámicamente los límites del panel A y B.
Deseo tener un diálogo interno (sin ventana) para solicitar la entrada de los miembros. Me gustaría que el diálogo se coloque centralmente en un JPanel existente.
He observado los layeredpanes en layeredpanes y parecen inutilizables debido a que solo tienen un único administrador de diseño (o ningún administrador de diseño) en todos los paneles. Supongo que podría intentar anular JLayeredPane y proporcionar un diseño personalizado, pero esto parece extremo.
Los paneles de vidrio tampoco parecen ser apropiados.
¿Cómo puede hacerse esto? ¿No hay un concepto utilizable de z-indexes en Swing?
http://i42.tinypic.com/30tkuvk.jpg
EDITAR
El motivo por el que los paneles estratificados no fueron apropiados se debió a la falta de un administrador de disposición por capa. El panel puede redimensionarse, el Panel A debe permanecer al 100% del área y el Panel B debe permanecer centralizado.
Hay otro administrador de diseño que puede ser de interés aquí: Diseño de superposición Aquí hay un tutorial simple: OverlayLayout: para la administración de diseño de los componentes que se encuentran uno encima del otro . El diseño de superposición le permite colocar los paneles uno encima del otro y establecer un diseño dentro de cada panel. También puede configurar el tamaño y la posición de cada panel por separado.
(La razón por la que estoy respondiendo esta pregunta hace años es porque he tropezado con el mismo problema, y he visto muy pocas menciones del Layout Overlay en , aunque parece estar bastante bien documentado. Con suerte, esto puede ayudar a alguien de lo contrario, quién lo sigue buscando).
JOptionPane.showInternalInputDialog probablemente haga lo que quieras. De lo contrario, sería útil comprender lo que falta.
Puede agregar un JDialog no decorado como este:
import java.awt.event.*;
import javax.swing.*;
public class TestSwing {
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame("Parent");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setVisible(true);
final JDialog dialog = new JDialog(frame, "Child", true);
dialog.setSize(300, 200);
dialog.setLocationRelativeTo(frame);
JButton button = new JButton("Button");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispose();
}
});
dialog.add(button);
dialog.setUndecorated(true);
dialog.setVisible(true);
}
}
Solo pensé que agregaría que hay una noción de orden Z en Swing, vea [java.awt.Component # setComponentZOrder] [1]
que afecta las posiciones de un componente en la matriz de componentes de sus padres, que determina el orden de la pintura.
Tenga en cuenta que debe anular javax.swing.JComponent#isOptimizedDrawingEnabled para que devuelva false en el contenedor primario para que los componentes superpuestos se vuelvan a pintar correctamente, de lo contrario sus repintados se pegarán entre sí. (JComponentes asumen que no se superponen los niños a menos que isOptimizedDrawingEnabled devuelva falso)
[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Container.html#setComponentZOrder(java.awt.Component , int)
Use un GridLayout de 1 por 1 en el JPanel existente, luego agregue su Panel a ese JPanel. El único problema con un GridLayout que es 1 por 1 es que no podrá colocar otros elementos en el JPanel. En este caso, tendrá que descubrir un diseño que sea adecuado. Cada panel que use puede usar su propio diseño para que no sea un problema.
¿Estoy entendiendo esta pregunta correctamente?