Hy, я пытаюсь создать окно с макетом, как на этом рисунке: макет

Мой идеал состоял в том, чтобы использовать панели и макеты вложений примерно так: layout2

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

package layout;

import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.*;
import models.People;

public class DetailWindow extends JFrame{

public DetailWindow(People newPeople) {
    JFrame frame = new JFrame("Detail Window");
    
    JPanel mainPanel = new JPanel(new GridLayout(1,2));
    frame.add(mainPanel);

    JPanel leftPanel = new JPanel(new GridLayout(2,1));
    frame.add(leftPanel);
    
    JPanel rightPanel = new JPanel(new GridLayout(3,1));
    frame.add(rightPanel);
    
    JPanel pictureHolder = new JPanel(new FlowLayout());
    pictureHolder.add(new JLabel(new ImageIcon(newPeople.getPic())));
    leftPanel.add(pictureHolder);
    
    JPanel infoHolder = new JPanel(new GridLayout(6,1));
    infoHolder.add(new JTextField(newPeople.getLb_name()));
    infoHolder.add(new JTextField(newPeople.getName()));
    infoHolder.add(new JTextField(newPeople.getLb_occup()));
    infoHolder.add(new JTextField(newPeople.getOccup()));
    infoHolder.add(new JTextField(newPeople.getLb_BD()));
    infoHolder.add(new JTextField(newPeople.getBD()));
    leftPanel.add(infoHolder);

    
    rightPanel.add(new JTextField(newPeople.getName()));
    rightPanel.add(new JTextField(newPeople.getOccup()));
    rightPanel.add(new JTextField(newPeople.getDetail()));
    
    frame.pack();
    frame.setSize(600, 400);
    frame.setLocationRelativeTo(null); // Center the frame
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.show();
  }
}

(Люди - это пользовательский класс, и в основном я просто вызываю конструктор DetailWindow)

Спасибо за помощь в продвижении!

0
Razero 4 Апр 2017 в 09:17

2 ответа

Лучший ответ

Если у вас всегда будет два коротких и один длинный текст с правой стороны, используйте BorderLayout для панели справа. Добавьте большой текст как BorderLayout.CENTER и создайте еще одну панель (может быть GridLayout) для двух более коротких текстов в верхней части. Добавьте эту вторую панель как BorderLayout.NORTH.

BorderLayout размещает один большой компонент в центре, а четыре других - по краям. GridLayout похож на таблицу и дает одинаковое пространство для всех компонентов, это не то, чего вы пытаетесь достичь.

Если вам нужно расположить несколько компонентов по вертикали, каждый из которых занимает только необходимое пространство, вам нужно использовать BoxLayout по запросу .

1
Community 23 Май 2017 в 12:09