2012-03-12 13 views
5

Mam trudności z określeniem, jakiego układu użyć. pomagać we wszelkich sugestiach.Układ Java swing

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

Tablice A, B, C, D ... nie mają stałej wielkości.

Jak mogę to zrobić?

Odpowiedz

1

Powiedziałbym, utworzyć tymczasowy panel do ACF, potem BDE, a następnie utworzyć połączyć ACF i BDE, następnie dodać ostatni panel temp i głównego panelu na ramie z BorderLayout północ i południe

1

Zależy od tego, jakie powinno być zachowanie podczas zmiany rozmiaru okna. Ale nie unikniesz budowania struktury drzewa za pomocą JPanels.

Komponent górny może mieć BorderLayout, z jednym panelem na północy i głównym panelem w środku.
Panel północny będzie miał BoxLayout w osi X i będzie zawierać dwa panele.
Oba te panele powinny mieć BoxLayout w osi Y, a pierwszy zawierać będzie A, C, F, a drugi B, D, E.

Powinieneś również ustawić preferowane rozmiary dla ABCDE i F, aby renderowały o odpowiedniej wielkości.

EDIT:
Tutaj, stworzyłem przykład:

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

można pominąć setPreferredSize(), dodałem go tylko do demonstate zachowanie. Możesz również spróbować zmienić rozmiar okna. Kod jest znacznie krótszy niż przy korzystaniu z GridBagLayout.

+0

Nie, _nie_ używaj ['setPreferredSize()'] (http: // stackoverflow.com/q/7229226/230513); niech treść określi rozmiar po 'pack()'. – trashgod

+0

-1 jeśli _nie unikniesz budowania drzewa_ tłumaczy się na "panele gniazdowe" (zgodnie z twoim opisem): po prostu źle - są LayoutManagers (nawet w rdzeniu), które mogą osiągnąć prawie każdy cel bez – kleopatra

+0

Oczywiście, możesz nawet użyć układ zerowy. Ale niektóre układy są łatwiejsze i bardziej przejrzyste w użyciu niż inne. Po prostu spójrz na kod Gagandeep. –

4

wydaje podobnie jak przy użyciu GridBagLayout, możesz to osiągnąć. Mam nadzieję, że można zmienić JPanel z MAGENTA kolor jak na swój gust :-)

Oto wynik:

GRIDBAG LAYOUT TEST

A oto kod:

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

Rozważ użycie JGoodies Układ formularzy. jest bardzo elastyczny i łatwy w użyciu. Każdy rodzaj layouting widżetów są możliwe, pionowy Stacking, poziome Stacking itp

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. 

Tak, można przeczytać więcej o JGoodies formularze układ 'DLU' oznacza jednostki dialogowych, raczej niż wyjaśnienie tych wszystkich, serdecznie odwiedź stronę JGoodies, pobierz bibliotekę i dokumentację. Zaufaj, ten menedżer układu jest znacznie lepszy pod względem użyteczności, łatwości konserwacji i czytelności.