2012-03-12 13 views
5

Im avendo difficoltà a identificare quale layout utilizzare. aiutare qualsiasi suggerimento.Layout swing 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); 
.... 

pannelli A, B, C, D sono ... non di fisso dimensioni.

Come posso renderlo possibile?

risposta

1

direi, creare un pannello temporaneo per ACF, quindi BDE, quindi creare uno per combinare ACF e BDE, quindi aggiungere l'ultimo pannello temperatura e il vostro pannello principale sul telaio con BorderLayout nord e sud

2

La griglia potrebbe essere adatta a questa forma. Basta guardare l'altalena java documentation.

1

Dipende da cosa dovrebbe essere il comportamento quando la finestra viene ridimensionata. Ma non eviterai di costruire una struttura ad albero con JPanels.

Il componente superiore può avere BorderLayout, con un pannello nel Nord e il pannello principale in Centro.
Il pannello Nord avrà BoxLayout dell'asse X e contiene due pannelli.
Entrambi questi cartelli dovrebbero avere asse Y BoxLayout e il primo conterranno A, C, F ed il secondo B, D, E.

È inoltre necessario impostare le dimensioni preferite per ABCDE e F in modo che rendono con dimensioni appropriate.

EDIT:
Qui, ho creato un esempio:

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

è possibile omettere il setPreferredSize(), ho aggiunto solo per demonstate comportamento. Puoi anche provare a ridimensionare la finestra. Il codice è molto più breve che quando si utilizza GridBagLayout.

+0

No, non usare _non_ ['setPreferredSize()'] (http: // stackoverflow.com/q/7229226/230513); lascia che il contenuto determini le dimensioni dopo 'pack()'. – trashgod

+0

-1 se _won't evitare di costruire un albero_ si traduce in "pannelli di nidificazione" (come da descrizione): semplicemente sbagliato - ci sono i LayoutManager (anche nel core) che possono raggiungere quasi tutti gli obiettivi senza – kleopatra

+0

Naturalmente, si può anche usare il layout nullo. Ma alcuni layout sono più facili e chiari da usare rispetto agli altri. Voglio dire, basta dare un'occhiata al codice di Gagandeep. –

4

Sembra come usando GridBagLayout, è possibile ottenere questo. Speriamo che si può cambiare il JPanel con MAGENTA colore secondo il vostro gradimento :-)

Ecco l'output:

GRIDBAG LAYOUT TEST

Ed ecco il codice:

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

Considerare l'utilizzo JGoodies Layout di moduli. è altamente flessibile e facile da usare. Qualsiasi tipo di interfaccia grafica di widget sono possibili, a magazzino verticale, imballaggio orizzontale ecc

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ì, avete letto più su JGoodies forme di layout, 'DLU' significa unità di dialogo, piuttosto che spiegare tutti questi, visita gentilmente il sito di JGoodies, scarica la libreria e la documentazione. Fiducia, questo layout manager è molto meglio in termini di usabilità, manutenibilità e leggibilità.