Pregunta

Deseo tener un cuadro de diálogo interno (sin ventana) para solicitar la opinión de los miembros.Me gustaría que el cuadro de diálogo se coloque centralmente en un JPanel existente.

he mirado paneles en capas y estos 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.

Paneles de vidrio Tampoco parece apropiado.

¿Cómo se puede hacer esto?¿No existe un concepto utilizable de índices z en Swing?

EDITAR

La razón por la que los paneles en capas no eran apropiados se debía a la falta de un administrador de diseño por capa.El panel se puede cambiar de tamaño, el Panel A debe permanecer en el 100% del área y el Panel B debe permanecer centralizado.

¿Fue útil?

Solución

Creo LayeredPane es su mejor apuesta aquí. Lo que necesitas un tercer panel pesar de contener A y B. Este tercer panel sería el layeredPane y luego el panel A y B todavía podría tener una agradable LayoutManagers. Todo lo que tendría que hacer es el centro de B en A y hay un buen montón de ejemplos en la pista de oscilación sobre cómo hacer esto. Tutorial para el 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();
    }

}

Se utiliza setBounds para posicionar los paneles en el interior del panel de capas y también para establecer sus tamaños.

Editar para reflejar los cambios post original Usted tendrá que añadir detectores de componentes que detectan cuando el contenedor primario se está cambiando el tamaño y luego cambiar dinámicamente los límites del panel A y B.

Otros consejos

Sólo pensé que me gustaría añadir que hay es una noción de orden Z en Swing, ver [Java.awt.Component # setComponentZOrder] [1]

que afecta a las posiciones de un componente en su matriz componente padres, que determina el orden de la pintura.

Tenga en cuenta que debe reemplazar javax.swing.JComponent # isOptimizedDrawingEnabled a return false en el contenedor primario para obtener sus componentes se superponen a pintar correctamente, de lo contrario sus repintados se clobber entre sí. (JComponents asumen sin niños superpuestas a menos isOptimizedDrawingEnabled devuelve false)

[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Container.html#setComponentZOrder (java.awt.Component , int)

Se puede añadir una JDialog sin decorar como esto:

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);
  }
}

Utilice un GridLayout 1 por 1 en las JPanel existentes, a continuación, añadir a su panel que JPanel. El único problema con un GridLayout que es de 1 en 1 es que usted no será capaz de colocar otros elementos en la JPanel. En este caso, tendrá que encontrar una disposición que es adecuado. Cada panel que utilice puede utilizar su propia disposición de modo que no sería un problema.

¿Puedo entender esta pregunta correctamente?

JOptionPane.showInternalInputDialog probablemente hace lo que quiere. Si no es así, sería de gran ayuda para entender lo que está faltando.

Hay otro administrador de diseño que puede resultar de interés aquí: Diseño de superposiciónAquí tienes un tutorial sencillo: Diseño de superposición:para la gestión del diseño de componentes superpuestos.Diseño de superposición le permite colocar 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 respondo esta pregunta de hace años es porque me encontré con el mismo problema y he visto muy pocas menciones del diseño de superposición en StackOverflow, aunque parece estar bastante bien documentado.Esperemos que esto pueda ayudar a alguien que siga buscándolo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top