2016-08-02 8 views
2

Я пытаюсь поместить компоненты в панели разных размеров. Но я понял, что GridLayout разделяет части с одинаковыми размерами. Как это может быть достигнуто, как описано ниже изображенияКачающиеся панели разных размеров

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class PanelDemo { 

    PanelDemo() { 

     // Create a new JFrame container. Use the default 
     // border layout. 
     JFrame jfrm = new JFrame("Use Three JPanels with Different Sizes"); 

     // Specify FlowLayout manager. 
     jfrm.getContentPane().setLayout(new GridLayout(1, 3)); 

     // Give the frame an initial size. 
     jfrm.setSize(900, 300); 

     // Terminate the program when the user closes the application. 
     jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Create the first JPanel. 
     JPanel jpnl = new JPanel(); 

     jpnl.setLayout(new GridLayout(2, 4)); 

     // Set the preferred size of the first panel. 
     jpnl.setPreferredSize(new Dimension(500, 300)); 

     // Make the panel opaque. 
     jpnl.setOpaque(true); 

     // Add a blue border to the panel. 
     jpnl.setBorder(
       BorderFactory.createLineBorder(Color.BLUE)); 

     // Create the second JPanel. 
     JPanel jpnl2 = new JPanel(); 

     //jpnl2.setLayout(new FlowLayout()); 
     // Set the preferred size of the second panel. 
     jpnl2.setPreferredSize(new Dimension(300, 300)); 

     // Make the panel opaque. 
     jpnl2.setOpaque(true); 

     jpnl2.setBorder(
       BorderFactory.createLineBorder(Color.RED)); 

     JPanel jpnl3 = new JPanel(); 
     jpnl3.setOpaque(true); 
     jpnl3.setPreferredSize(new Dimension(100, 300)); 
     jpnl3.setBorder(
       BorderFactory.createLineBorder(Color.ORANGE)); 

     // Add the panels to the frame. 
     jfrm.getContentPane().add(jpnl); 
     jfrm.getContentPane().add(jpnl3); 
     jfrm.getContentPane().add(jpnl2); 

     // Display the frame. 
     jfrm.setVisible(true); 
    } 

    public static void main(String args[]) { 
     // Create the frame on the event dispatching thread. 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new PanelDemo(); 
      } 
     }); 
    } 
} 
+1

'BorderLayout' используя' LINE_START', '' CENTER' & LINE_END' ограничения могут сделать это. Но если графический интерфейс изменен, центральная панель получит дополнительное пространство. –

+0

BTW - что находится в каждой панели? Если «компоненты» лучше всего разрешить макет, используемый для панели, давать подсказки относительно предпочтительного размера, а не явно устанавливать его. Затем вместо вызова 'jfrm.setSize (900, 300);' - просто позвонить 'jfrm.pack();' (после добавления всех компонентов). –

+1

BoxLayout? GridBagLayout? Прочтите учебник Swing [Менеджеры макетов] (http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html). Каждый менеджер макетов имеет разные правила для изменения размера при изменении размера фрейма. Какой бы макет вы ни использовали, зависит от ваших точных требований. Играйте с каждым менеджером макета, а затем решайте, что лучше всего подходит для вашего требования. – camickr

ответ

3

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class TwoPanelWithButtonsLayout { 

    private JComponent ui = null; 
    private Insets buttonMargin = new Insets(10,10,10,10); 

    TwoPanelWithButtonsLayout() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui!=null) return; 

     ui = new JPanel(new BorderLayout(4,4)); 
     ui.setBorder(new EmptyBorder(4,4,4,4)); 

     int gap = 5; 

     JPanel buttons1 = new JPanel(new GridLayout(2, 4, gap, gap)); 
     // 50 is the gap on right, alter as needed 
     buttons1.setBorder(new EmptyBorder(0, 0, 0, 50)); 
     for (int ii=1; ii<9; ii++) { 
      buttons1.add(getBigButton("" + ii)); 
     } 
     ui.add(buttons1, BorderLayout.CENTER); 

     JPanel buttons2 = new JPanel(new GridLayout(2, 2, gap, gap)); 
     for (int ii=1; ii<5; ii++) { 
      buttons2.add(getBigButton("" + ii)); 
     } 
     ui.add(buttons2, BorderLayout.LINE_END); 
    } 

    private JButton getBigButton(String text) { 
     JButton b = new JButton(text); 
     Font f = b.getFont(); 
     b.setFont(f.deriveFont(f.getSize()*3f)); 
     b.setMargin(buttonMargin); 
     return b; 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       TwoPanelWithButtonsLayout o = new TwoPanelWithButtonsLayout(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

спасибо, что я изучаю его сейчас адепт – swinger

+0

By Кстати, вы предпочитаете конструктор форм (создатель GUI идеала) или рукописный ввод для создания графического интерфейса? Если вы предпочитаете конструктор форм, не могли бы вы рассказать мне, что вы используете? – swinger

+0

Я делаю свои GUI вручную. Формообразователи хороши для прототипирования, но не более того. Кроме того, чтобы эффективно использовать их, вам нужно понять, как использовать и комбинировать макеты в любом случае. –

3

Вы можете использовать FlowLayout но если они изменить размер кадра, то он будет обернуть панели.

+0

как насчет пробелов с обеих сторон справа и слева? – swinger

+0

FlowLayout имеет горизонтальный зазор, который можно установить на ноль. См. Javadoc: http://docs.oracle.com/javase/8/docs/api/java/awt/FlowLayout.html#FlowLayout-int-int-int- – Jayfray