Как сделать этот макет с помощью Java Swing? - PullRequest
1 голос
/ 11 декабря 2011

У меня следующий макет:

enter image description here

Красные, синие и зеленые части - JPanelВ красной части у меня четыре JLabel.Теперь, если я изменю размер JFrame, метки заголовка всегда остаются в центре.Но я бы предпочел, чтобы они равномерно распределялись по горизонтали в красной части.Какой макет мне использовать для этого?

Ответы [ 7 ]

6 голосов
/ 11 декабря 2011

Используйте GridLayout (1, 0) для верхней JPanel.Два числа означают 1 строку и переменное количество столбцов.Если вы используете JLabels, этого будет достаточно, особенно если вы установите константу выравнивания JLabels равной SwingConstants.CENTER.Если вы используете компоненты, которые заполняют ячейки сетки, такие как JButtons, то вам может потребоваться использовать другие варианты конструктора GridLayout, такие как GridLayout (1, 0,?, 0) Где?это число, которое сообщает GridLayout, какое горизонтальное расстояние должно быть между слотами.

Общий графический интерфейс, конечно, будет использовать BorderLayout.

Для получения более подробной информации об этом, пожалуйста, ознакомьтесь с Урок: Компоновка компонентов в контейнере и Визуальное руководство для менеджеров по макету

Например:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.*;

public class LayoutEg {

   private static void createAndShowGui() {
      String[] labelStrings = {"One", "Two", "Three", "Four"};
      JPanel topPanel = new JPanel(new GridLayout(1, 0));
      for (String labelString : labelStrings) {
         // create labels and center the text
         topPanel.add(new JLabel(labelString, SwingConstants.CENTER)); 
      }
      topPanel.setBackground(Color.red);

      JPanel centerPanel = new JPanel();
      centerPanel.setBackground(Color.blue);

      // setting preferred size for demonstration purposes only
      centerPanel.setPreferredSize(new Dimension(700, 400));

      JPanel bottomPanel = new JPanel();
      bottomPanel.setBackground(Color.green);

      // main panel uses BorderLayout
      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(centerPanel, BorderLayout.CENTER);
      mainPanel.add(topPanel, BorderLayout.PAGE_START);
      mainPanel.add(bottomPanel, BorderLayout.PAGE_END);


      JFrame frame = new JFrame("LayoutEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_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();
         }
      });
   }
}
4 голосов
/ 11 декабря 2011

Используйте BorderLayout для области содержимого фрейма и используйте GridLayout с 1 строкой и четырьмя столбцами для панели заголовка.

См. http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html и http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html для учебных пособий.

Если вы не хотите, чтобы для каждой метки была назначена одинаковая ширина, но фактически требуется одинаковое пространство между каждой меткой, вы также можете использовать BoxLayout и добавить клей между каждой меткой (и между границей).панели и этикетки:

p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Long Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Very long Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Extremely long Label"));
p.add(Box.createHorizontalGlue());
3 голосов
/ 11 декабря 2011
  • Используйте BorderLayout для основного кадра и используйте места NORTH, CENTER и SOUTH.
  • Чтобы создать пустое пространство, как на нижней панели, используйте Box.createVerticalStrut(size).
  • Используйте BoxLayout, чтобы разместить этикетки, упакованные в ряд.
  • Наконец, используйте GridBagLayout, чтобы центрировать панель на другой панели.

Вот краткий пример:

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Prototype extends JFrame {

    public Prototype() {

        JPanel labelPanel = new JPanel();
        labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.LINE_AXIS));
        labelPanel.add(new JLabel("First"));
        labelPanel.add(Box.createHorizontalStrut(10));
        labelPanel.add(new JLabel("Second"));
        labelPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
        labelPanel.setOpaque(false);

        JPanel bottomPanel = new JPanel();
        bottomPanel.add(Box.createVerticalStrut(15));
        bottomPanel.setBackground(Color.GREEN);

        JPanel centerPanel = new JPanel();
        centerPanel.add(Box.createRigidArea(new Dimension(200, 300)));
        centerPanel.setBackground(Color.BLUE);

        JPanel northPanel = new JPanel(new GridBagLayout());
        northPanel.add(labelPanel);
        northPanel.setBackground(Color.RED);

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(northPanel, BorderLayout.NORTH);
        panel.add(centerPanel, BorderLayout.CENTER);
        panel.add(bottomPanel, BorderLayout.SOUTH);

        add(panel);
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Prototype();
    }

}
2 голосов
/ 11 декабря 2011

Используйте MigLayout .

Нет, серьезно, я обычно сходил с ума, пытаясь заставить работать макеты Java.Затем я начал поддерживать какое-то программное обеспечение, которое использует MigLayouts, и примерно через неделю я мог делать все, что хотел.Существует превосходная шпаргалка , которая выглядит довольно пугающей, но невероятно полезной.

С MigLayout, чтобы равномерно распределить метки в JPanel, вы бы:

// the "fillx" means that the layout will expand to take up all available horizontal space
JPanel panel = new JPanel(new Miglayout("fillx"));

// the "growx" means that the component will expand to take up all available horizontal space
add(new JLabel("Work items"), "growx");
add(new JLabel("Change set"), "growx");
add(new JLabel("Files"), "growx");
add(new JLabel("Source code"), "growx");
1 голос
/ 11 декабря 2011

gridLayout, поместите метки в макет сетки и установите строки в 1 и столбцы в 4 (1 строка для каждой метки)

http://www.javabeginner.com/java-swing/java-gridlayout-class-example

0 голосов
/ 11 декабря 2011

Для равномерного горизонтального распределения этикеток - на красной панели - используйте BoxLayout с направлением X_AXIS и наносите «клей» между каждой этикеткой - подробнее здесь -

http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html

0 голосов
/ 11 декабря 2011

GridBagLayout - это один из подходов.Установите значение weightx на 1.0.

...