2013-06-06 7 views
-1

У меня есть controlPanel (BoxLayout):Вложенные схемы - FlowLayout внутри BoxLayout

controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS)); 

Теперь я строю два FlowLayout и добавить их к contolPanel панели:

JPanel fromDatePanel = new JPanel(new FlowLayout()); 
JPanel untilDatePanel = new JPanel(new FlowLayout()); 

fromDatePanel.add(new JLabel("From - ")); 
fromDatePanel.add(new JButton("...")); 
untilDatePanel.add(new JLabel("Until - ")); 
untilDatePanel.add(new JButton("...")); 

controlPanel.add(fromDatePanel); 
controlPanel.add(untilDatePanel); 

я получаю это:

enter image description here

Почему это создает разрыв между макетами? Например, если я вставляю JButton, он отлично работает (он вставляет их без зазора).

Как устранить разрыв между двумя FlowLayout? (Таким образом, это будет похоже на синий зазор)

+1

Если вы хотите сохранить 'BoxLayout' и избавиться от разрыва, переопределение' getMaximumSize() 'из 'JPanel' и возвращаем' getPreferredSize'. См. Мой ответ ниже. –

+0

@GuillaumePolet Спасибо, это помогло! – Maroun

ответ

2

Вы можете достичь вертикальной компоновки (вертикально по центру), используя GridBagLayout (и использовать GridBagConstraint с gridwidth=REMAINDER):

import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestGridBagLayout { 

    protected void initUI() { 
     JFrame frame = new JFrame(); 
     JPanel controlPanel = (JPanel) frame.getContentPane(); 
     controlPanel.setLayout(new GridBagLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 

     JPanel fromDatePanel = new JPanel(new FlowLayout()); 
     JPanel untilDatePanel = new JPanel(new FlowLayout()); 

     fromDatePanel.add(new JLabel("From - ")); 
     fromDatePanel.add(new JButton("...")); 
     untilDatePanel.add(new JLabel("Until - ")); 
     untilDatePanel.add(new JButton("...")); 

     controlPanel.add(fromDatePanel, gbc); 
     controlPanel.add(untilDatePanel, gbc); 
     frame.setSize(600, 600); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestGridBagLayout testMultiplePanels = new TestGridBagLayout(); 
       testMultiplePanels.initUI(); 

      } 
     }); 
    } 

} 

Что касается различия между JButton и JPanel при добавлении до BoxLayout, это связано с различиями в реализации getMaximumSize(), который учитывается e BoxLayout. JButton возвращает предпочтительный размер, в то время как JPanel вернет null, который интерпретируется BoxLayout как бесконечные размеры.

Если вы хотите сохранить BoxLayout, вы можете переопределить JPanel.getMaximumSize() и вернуть getPreferredSize():

import java.awt.Dimension; 
import java.awt.FlowLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestGridBagLayout { 

    protected void initUI() { 
     JFrame frame = new JFrame(); 
     JPanel controlPanel = (JPanel) frame.getContentPane(); 
     controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel fromDatePanel = new JPanel(new FlowLayout()) { 
      @Override 
      public Dimension getMaximumSize() { 
       return getPreferredSize(); 
      } 
     }; 
     JPanel untilDatePanel = new JPanel(new FlowLayout()) { 
      @Override 
      public Dimension getMaximumSize() { 
       return super.getMaximumSize(); 
      } 
     }; 

     fromDatePanel.add(new JLabel("From - ")); 
     fromDatePanel.add(new JButton("...")); 
     untilDatePanel.add(new JLabel("Until - ")); 
     untilDatePanel.add(new JButton("...")); 

     controlPanel.add(fromDatePanel); 
     controlPanel.add(untilDatePanel); 
     frame.setSize(600, 600); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestGridBagLayout testMultiplePanels = new TestGridBagLayout(); 
       testMultiplePanels.initUI(); 

      } 
     }); 
    } 

} 
+0

Это объясняет это! Спасибо, мой друг. – Maroun

+0

Я пробовал это, он не работает: \ – Maroun

+1

@MarounMaroun Я попробовал, и он работает: \ Отправить [SSCCE] (http://sscce.org). См. Мое редактирование. –

2

См. Using Invisible Components as Filler около Box.createVerticalGlue().

+0

Это не сработает. Я хочу сделать обратное - сделать два 'FlowLayout' подходящими друг к другу (без пробелов). – Maroun

+1

Затем используйте 'GridBagLayout' или' GroupLayout'; последнее видно [здесь] (http://stackoverflow.com/a/8504753/230513). – trashgod

+0

Спасибо, я буду. Но это интересно, я все еще хочу найти решение этой проблемы. Меня это раздражает: D – Maroun

1

enter image description here

Я использовал BorderLayout, и она работала.

 JPanel controlPanel = new JPanel(); 
     // controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS)); 
     controlPanel.setLayout(new BorderLayout()); 

     JPanel fromDatePanel = new JPanel(new FlowLayout()); 
     JPanel untilDatePanel = new JPanel(new FlowLayout()); 

     fromDatePanel.add(new JLabel("From - ")); 
     fromDatePanel.add(new JButton("...")); 
     untilDatePanel.add(new JLabel("Until - ")); 
     untilDatePanel.add(new JButton("...")); 

     controlPanel.add(fromDatePanel, BorderLayout.NORTH); 
     controlPanel.add(untilDatePanel, BorderLayout.CENTER); 

Edit-1:

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

Nested Panels

 JPanel controlPanel = new JPanel(); 
     controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS)); 
     // controlPanel.setLayout(new BorderLayout()); 

     JPanel fromDatePanel = new JPanel(new FlowLayout()); 
     JPanel untilDatePanel = new JPanel(new FlowLayout()); 
     JPanel thirdPnl = new JPanel(new FlowLayout()); 
     JPanel fourthPnl = new JPanel(new FlowLayout()); 

     JPanel thrdForthPnl = new JPanel(new BorderLayout()); 

     fourthPnl.add(new JLabel("Fourth")); 
     fourthPnl.add(new JButton("4.1")); 

     thirdPnl.add(new JLabel("Third")); 
     thirdPnl.add(new JButton("3.1")); 

     thrdForthPnl.add(thirdPnl, BorderLayout.NORTH); 
     thrdForthPnl.add(fourthPnl, BorderLayout.CENTER); 

     fromDatePanel.add(new JLabel("From - ")); 
     fromDatePanel.add(new JButton("...")); 
     untilDatePanel.add(new JLabel("Until - ")); 
     untilDatePanel.add(new JButton("...")); 

     controlPanel.add(fromDatePanel, BorderLayout.NORTH); 
     controlPanel.add(untilDatePanel, BorderLayout.CENTER); 
     controlPanel.add(thrdForthPnl, BorderLayout.SOUTH); 
+0

Спасибо. Но это будет работать только для двух панелей. Я использую 'BoxLayout', потому что хочу добавить более двух кнопок. – Maroun

+0

@MarounMaroun Вы можете добавить столько объявлений панелей, которые хотите видеть внутри каждой панели. И добавьте мать всех панелей в contentPane. Создавая панель, вы можете даже повторно использовать эту панель позже. – Amarnath

 Смежные вопросы

  • Нет связанных вопросов^_^