2015-06-14 2 views
0

В Java BorderLayout в NORTH части, как правило, так:Как получить этот макет Java?

enter image description here

Так что я хочу иметь это, что NORTH и SOUTH часть имеют ту же ширину, что и CENTER. Но часть EAST и WEST должна иметь высоту CENTER. Это означает, что углы должны быть пустыми. Я не хочу использовать GridLayout для этого, потому что я не хочу, чтобы NORTH имел ту же высоту, что и CENTER.

Как получить этот макет?

+1

больше походит на случай для '' GridBagLayout' или GroupLayout' .. –

+0

Просто используйте два BorderLayout с помощью JPanels. Во внутреннем, добавьте свои северные и южные панели. Поместите внутренний в положение BorderLayout.CENTER в внешнем. Готово. –

+0

В 199-2000 годах я делал апплеты. Я никогда не видел необходимости использовать диспетчер компоновки. Вы хотите, чтобы ваш макет входил и выходил? Мы использовали setlayout (null) и устанавливали вставки каждого компонента самостоятельно, намного лучше размещали и отлично работали даже сегодня – tgkprog

ответ

5

Просто гнездо двух BorderLayout используя JPanels. Во внутреннем, добавьте свои северные и южные панели. Поместите внутренний в положение BorderLayout.CENTER в внешнем. Готово.

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import javax.swing.*; 

public class SimpleLayout extends JPanel { 
    public SimpleLayout() { 
     JPanel innerPanel = new JPanel(new BorderLayout()); 
     innerPanel.add(createLabeledPanel("Center"), BorderLayout.CENTER); 
     innerPanel.add(createLabeledPanel("North"), BorderLayout.PAGE_START); 
     innerPanel.add(createLabeledPanel("South"), BorderLayout.PAGE_END); 

     setLayout(new BorderLayout()); 
     add(innerPanel, BorderLayout.CENTER); 
     add(createLabeledPanel("East"), BorderLayout.LINE_END); 
     add(createLabeledPanel("West"), BorderLayout.LINE_START); 
    } 

    private JComponent createLabeledPanel(String text) { 
     JLabel label = new JLabel(text, SwingConstants.CENTER); 
     JPanel panel = new JPanel(); 
     panel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     panel.add(label); 
     return panel; 
    } 

    private static void createAndShowGui() { 
     SimpleLayout mainPanel = new SimpleLayout(); 

     JFrame frame = new JFrame("SimpleLayout"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

@dma * «Но часть' EAST' и 'WEST' должна иметь высоту' CENTER'. * * Или, чтобы поместить этот другой способ, я думаю, что это означает [здесь] (http: // stackoverflow. ком/а/30832022/418556). ;) –

+1

@AndrewThompson: ах, так много для тщательного чтения, и спасибо за разъяснение. 1+ к вашему ответу. –

3

Как уже отмечался в комментариях, мы можем получить этот макет «пустые углов» довольно легко с помощью GridBagLayout. Желтые части - это просто (панель с меткой), которая не имеет текста.

enter image description hereenter image description here

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

public class EmptyCornerLayout { 

    private JComponent ui = null; 
    GridBagConstraints gbc = new GridBagConstraints(); 

    EmptyCornerLayout() { 
     initUI(); 
    } 

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

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

     gbc.weightx = 0.5; 
     gbc.weighty = 0.5; 
     gbc.fill = GridBagConstraints.BOTH; 

     // first row 
     addComponentToLayout(0, 0, 0d, 0d, Color.YELLOW, ""); 
     addComponentToLayout(0, 1, 1d, 0d, Color.CYAN, "NORTH"); 
     addComponentToLayout(0, 2, 0d, 0d, Color.YELLOW, ""); 

     // 2nd row 
     addComponentToLayout(1, 0, 0d, 1d, Color.CYAN, "WEST"); 
     addComponentToLayout(1, 1, 1d, 1d, Color.RED, "CENTER"); 
     addComponentToLayout(1, 2, 0d, 1d, Color.CYAN, "EAST"); 

     // last row 
     addComponentToLayout(2, 0, 0d, 0d, Color.YELLOW, ""); 
     addComponentToLayout(2, 1, 1d, 0d, Color.CYAN, "SOUTH"); 
     addComponentToLayout(2, 2, 0d, 0d, Color.YELLOW, ""); 
    } 

    private final void addComponentToLayout(
      int row, int col, 
      double weightx, double weighty, 
      Color color, String text) { 
     JPanel panel = new JPanel(); 
     panel.setBackground(color); 
     panel.add(new JLabel(text)); 

     gbc.gridx = col; 
     gbc.gridy = row; 
     gbc.weightx = weightx; 
     gbc.weighty = weighty; 
     ui.add(panel, gbc); 
    } 

    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) { 
       } 
       EmptyCornerLayout o = new EmptyCornerLayout(); 

       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); 
    } 
} 
Смежные вопросы