Java качели макет из двух компонентов - PullRequest
6 голосов
/ 21 октября 2011
    +--------------------------------------------+
    |                 +-------+      +----------+|
    |                 | +---+ |      |  +-----+ ||
    |                 | | A | |      |  |  B  | ||
    |                 | +---+ |      |  +-----+ ||
    |                 +-------+      +----------+|
    +--------------------------------------------+
                          ^
                          |
                          |
                        Center

Фон: У меня

  • a JButton ("A"), размер 50x25, внутри JPanel (FlowLayout.CENTER)
  • a JLabel ("B"), размер 100x25, внутри JPanel (FlowLayout.RIGHT)
  • два JPanel находятся в JPanel

Желаемый результат: Я хочу

  • JButton "A" всегда центрируется по горизонтали,
  • JLabel "B" всегда должен быть на одном уровне.

То, что я пробовал: Это не сработало для меня

  • BorderLayout не работает для меня, потому что JButton "A" смещен ВЛЕВО:
  • Я бы предпочел не ставить невидимый компонент WEST, чтобы отменить сдвиг

    +--------------------------------------------+
    |            +-------+           +----------+|
    |            | +---+ |           |  +-----+ ||
    |            | | A | |           |  |  B  | ||
    |            | +---+ |           |  +-----+ ||
    |            +-------+           +----------+|
    +--------------------------------------------+
                     ^    ^
                     |    |
                     |    |
                     |  Center
                     |
                   Shifted Left
    
  • GridLayout не будет работать, потому что я не хочу расширять "A" и "B"

Ценю любые предложения!

приписка

Каждый JButton / JLabels находится внутри своих собственных JPanels, потому что БЕЗ Jpanel, BorderLayout.CENTER расширяет JButton по всей ширине главной панели (до левого края JLabel). JPanels не нужны / критически важны для постановки задачи

Заключение

  • Я отправил ответ на "Hovercraft Full Of Eels", размещенный ниже. Спасибо!

1 Ответ

5 голосов
/ 21 октября 2011

Вы должны вкладывать JPanels и использовать комбинацию макетов.Помещение панелей, содержащих JButtons, в другой JPanel, который использует GridLayout (1, 0) (1 строка, переменное число столбцов), может сработать, и помещение этого JPanel в положение BorderLayout.NORTH для JPanel с использованием BorderLayout может работать.*

Например

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

public class Foo003 {

   private static void createAndShowGui() {
      JButton btnA = new JButton("A");
      JButton btnB = new JButton("B");

      btnA.setPreferredSize(new Dimension(50, 25));
      btnB.setPreferredSize(new Dimension(100, 25));

      JPanel btnAPanel = new JPanel(); // uses default FlowLayout.CENTER
      JPanel btnBPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
      btnAPanel.add(btnA);
      btnBPanel.add(btnB);

      JPanel topPanel = new JPanel(new GridLayout(1, 0));
      topPanel.add(new JLabel("")); // empty placeholder label
      topPanel.add(btnAPanel);
      topPanel.add(btnBPanel);

      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(topPanel, BorderLayout.NORTH);

      mainPanel.setPreferredSize(new Dimension(400, 300));

      JFrame frame = new JFrame("Foo003");
      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();
         }
      });
   }
}
...