2012-03-12 26 views
5

Tengo dificultades para identificar qué diseño utilizar. ayuda con cualquier sugerenciaDisposición de oscilación Java

enter image description here

JPanel mainpanel = new JPanel(); 

public void addPanel(JPanel panel){ 
    mainpanel.add(panel); 
} 

addPanel(A); 
addPanel(B); 
addPanel(C); 
addPanel(D); 
addPanel(E); 
.... 

paneles A, B, C, D ... no son de tamaño fijo.

¿Cómo puedo hacer esto posible?

Respuesta

1

diría, crear un panel temporal para ACF, a continuación, BDE, a continuación, crear uno para combinar ACF y el BDE, a continuación, añadir el último panel de temperatura y el panel principal en el bastidor con BorderLayout norte y sur

2

El diseño de la cuadrícula puede encajar en esta forma. Basta con mirar a la oscilación java documentation.

1

Depende de cuál debería ser el comportamiento cuando se cambia el tamaño de la ventana. Pero no evitarás construir una estructura de árbol con JPanels.

El componente superior puede tener BorderLayout, con un panel en el norte y el panel principal en el centro.
El panel Norte tendrá BoxLayout en el eje X y contendrá dos paneles.
Ambos estos paneles deben tener eje Y BoxLayout y el primero contendrán A, C, F y la segunda B, D, E.

También debe establecer tamaños preferidos para ABCDE y F para que rinda con el tamaño apropiado.

EDIT:
Aquí, he creado un ejemplo:

public class GladysPanel extends JPanel 
{ 
    public GladysPanel(JComponent A, JComponent B, JComponent C, JComponent D, JComponent E, JComponent F, JComponent main){ 
     super(new BorderLayout()); 
      JPanel abcdef = new JPanel(new BorderLayout()); 
       Box ab = new Box(BoxLayout.X_AXIS); 
       ab.add(A); 
       ab.add(B); 
      abcdef.add(ab, BorderLayout.NORTH); 
       Box cdef = new Box(BoxLayout.X_AXIS); 
        Box cf = new Box(BoxLayout.Y_AXIS); 
        cf.add(C); 
        cf.add(F); 
        cf.add(Box.createVerticalGlue()); 
        Box de = new Box(BoxLayout.Y_AXIS); 
        de.add(D); 
        de.add(E); 
        de.add(Box.createVerticalGlue()); 
       cdef.add(cf, BorderLayout.WEST); 
       cdef.add(de, BorderLayout.EAST); 
      abcdef.add(cdef); 
     add(abcdef, BorderLayout.NORTH); 
     add(main); 
    } 

    public static void main(String[] args){ 
     JPanel A = new JPanel(); 
     A.setOpaque(true); 
     A.setBackground(Color.BLUE); 
     A.add(new JLabel("A")); 
     JPanel B = new JPanel(); 
     B.setOpaque(true); 
     B.setBackground(Color.LIGHT_GRAY); 
     B.add(new JLabel("B")); 
     JPanel C = new JPanel(); 
     C.setPreferredSize(new Dimension(0, 100)); 
     C.setOpaque(true); 
     C.setBackground(Color.RED); 
     C.add(new JLabel("C")); 
     JPanel D = new JPanel(); 
     D.setOpaque(true); 
     D.setBackground(Color.PINK); 
     D.add(new JLabel("D")); 
     JPanel E = new JPanel(); 
     E.setOpaque(true); 
     E.setBackground(Color.YELLOW); 
     E.add(new JLabel("E")); 
     E.setPreferredSize(new Dimension(0, 60)); 
     JPanel F = new JPanel(); 
     F.setOpaque(true); 
     F.setBackground(Color.MAGENTA); 
     F.add(new JLabel("F")); 
     JPanel main = new JPanel(); 
     main.setOpaque(true); 
     main.setBackground(Color.WHITE); 
     main.add(new JLabel("main")); 

     GladysPanel panel = new GladysPanel(A, B, C, D, E, F, main); 
     JFrame example = new JFrame("Gladys example"); 
     example.setContentPane(panel); 
     example.setSize(300, 300); 
     example.setVisible(true); 
    } 
} 

se puede omitir el setPreferredSize(), que añade sólo a demonstate comportamiento. También puede intentar cambiar el tamaño de la ventana. El código es mucho más corto que cuando se usa GridBagLayout.

+0

No, no _no_ use ['setPreferredSize()'] (http: // stackoverflow.com/q/7229226/230513); deja que el contenido determine el tamaño después de 'pack()'. – trashgod

+0

-1 si _sin evitar construir un árbol_ se traduce en "paneles de anidación" (según su descripción): simplemente incorrecto - hay Administradores de diseño (incluso en el núcleo) que pueden lograr casi cualquier objetivo sin – kleopatra

+0

Por supuesto, incluso puede usar el diseño nulo Pero algunos diseños son más fáciles y más claros de usar que los otros. Quiero decir, solo eche un vistazo al código de Gagandeep. –

4

Parece al usar GridBagLayout, puede lograrlo. Esperamos que usted puede cambiar el color de JPanel con MAGENTA según su gusto :-)

Aquí está la salida:

GRIDBAG LAYOUT TEST

Y aquí está el código:

import java.awt.*; 
import javax.swing.*; //swing package 

public class GridBagLayoutTest 
{ 


    //defining the constructor 
    public GridBagLayoutTest() 
    { 

     JFrame maFrame = new JFrame("The main screen"); //creating main Jframe 
     maFrame.setLocationByPlatform(true); //centering frame 

     JPanel headPanel = new JPanel(); //creating the header panel 

     Container container = maFrame.getContentPane(); 
     container.setLayout(new GridBagLayout()); //setting layout of main frame 
     GridBagConstraints cns = new GridBagConstraints(); //creating constraint 
     cns.gridx = 0; 
     cns.gridy = 0; 
     //cns.gridwidth = 3; 
     //cns.gridheight = 4; 
     cns.weightx = 0.5; 
     cns.weighty = 0.2; 
     cns.anchor = GridBagConstraints.FIRST_LINE_START; 
     cns.fill = GridBagConstraints.BOTH;   
     headPanel.setBackground(Color.BLUE); 
     container.add(headPanel, cns); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.CYAN); 
     cns = new GridBagConstraints(); 
     cns.gridx = 1; 
     cns.gridy = 0; 
     //cns.gridwidth = 7; 
     //cns.gridheight = 4; 
     cns.weightx = 0.5; 
     cns.weighty = 0.2; 
     cns.anchor = GridBagConstraints.FIRST_LINE_END; 
     cns.fill = GridBagConstraints.BOTH; 
     container.add(panel, cns); 

     JPanel panel1 = new JPanel(); 
     panel1.setBackground(Color.RED); 
     cns = new GridBagConstraints(); 
     cns.gridx = 0; 
     cns.gridy = 1; 
     //cns.gridwidth = 2; 
     cns.gridheight = 2; 
     cns.weightx = 0.5; 
     cns.weighty = 0.3; 
     cns.anchor = GridBagConstraints.LINE_START; 
     cns.fill = GridBagConstraints.BOTH; 
     container.add(panel1, cns);  

     JPanel panel2 = new JPanel(); 
     panel2.setBackground(Color.PINK); 
     cns = new GridBagConstraints(); 
     cns.gridx = 1; 
     cns.gridy = 1; 
     //cns.gridwidth = 2; 
     //cns.gridheight = 2; 
     cns.weightx = 0.5; 
     cns.weighty = 0.2; 
     cns.anchor = GridBagConstraints.LINE_END; 
     cns.fill = GridBagConstraints.BOTH; 
     container.add(panel2, cns);     

     JPanel panel4 = new JPanel(); 
     panel4.setBackground(Color.ORANGE); 
     cns = new GridBagConstraints(); 
     cns.gridx = 1; 
     cns.gridy = 2; 
     //cns.gridwidth = 2; 
     //cns.gridheight = 2; 
     cns.weightx = 0.5; 
     cns.weighty = 0.2; 
     cns.anchor = GridBagConstraints.LINE_END; 
     cns.fill = GridBagConstraints.BOTH; 
     container.add(panel4, cns); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setBackground(Color.WHITE); 
     mainPanel.setLayout(new GridBagLayout()); 
     cns = new GridBagConstraints(); 
     cns.gridx = 0; 
     cns.gridy = 4; 
     cns.gridwidth = 2; 
     cns.gridheight = 2; 
     cns.weightx = 1.0; 
     cns.weighty = 0.3; 
     cns.anchor = GridBagConstraints.LAST_LINE_START; 
     cns.fill = GridBagConstraints.BOTH; 
     container.add(mainPanel, cns); 

     JPanel panel3 = new JPanel(); 
     panel3.setBackground(Color.MAGENTA); 
     cns = new GridBagConstraints(); 
     cns.gridx = 0; 
     cns.gridy = 0; 
     //cns.gridwidth = 2; 
     //cns.gridheight = 2; 
     cns.weightx = 0.5; 
     cns.weighty = 0.2; 
     cns.anchor = GridBagConstraints.FIRST_LINE_START; 
     cns.fill = GridBagConstraints.BOTH; 
     mainPanel.add(panel3, cns); 

     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setBackground(Color.WHITE); 
     cns = new GridBagConstraints(); 
     cns.gridx = 0; 
     cns.gridy = 1; 
     //cns.gridwidth = 2; 
     //cns.gridheight = 2; 
     cns.weightx = 1.0; 
     cns.weighty = 0.2; 
     cns.anchor = GridBagConstraints.LAST_LINE_START; 
     cns.fill = GridBagConstraints.BOTH; 
     mainPanel.add(bottomPanel, cns); 

     //JButton button = new JButton("BUTTON"); 
     //headPanel.add(button); 

     maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //setting the default close operation of JFrame 
     maFrame.pack(); 
     maFrame.setVisible(true); //making the frame visible 
    } 

    //defining the main method 
    public static void main(String[] args) 
    { 
     Runnable runnable = new Runnable() 
     { 
      public void run() 
      { 
       new GridBagLayoutTest(); //instantiating the class 
      } 
     }; 
     SwingUtilities.invokeLater(runnable);  
    } 
} 
3

Considere el uso de JGoodies Diseño de formularios. es altamente flexible y fácil de usar. Cualquier tipo de maquetación de widgets son posibles apilamiento, vertical, horizontal, etc. apilamiento

http://www.jgoodies.com/freeware/forms/index.html

enter image description here

    /* B1 Space B2 Space B3 Space B4 */ 
    String col1 = "10dlu, 3dlu, 10dlu, 3dlu 10dlu, 3dlu, 10ldu"; 
        /*Width of button */ 
    String row1 = "5dlu"; 

    FormLayout layout = new FormLayout(col1, row1); 

    JPanel panel = new JPanel(layout); 

    panel.setBorder(Borders.DIALOG_BORDER); 

    CellConstraints cc = new CellConstraints(); 

    /* X - stands for column position :: Y - stand for row */ 
    panel.add(new JButton("B1"), cc.xy(1, 1)); 

    panel.add(new JButton("B2"), cc.xy(2, 1)); 
    . 
    . 
    . 
    there is one more cc.xyh(1,1,2) where 'h' stands for vertical span or width. 

Sí, ha leído más sobre JGoodies formas de diseño, 'DLU' significa unidades de diálogo, en lugar de que yo explique todo esto, visite amablemente el sitio de JGoodies, descargue la biblioteca y la documentación. Confíe en que este administrador de diseño es mucho mejor en términos de usabilidad, facilidad de mantenimiento y legibilidad.