Упакуйте правильно массивы элементов на JFrame
У меня есть простая форма и два массива, JLabels и JTextFeilds:
ArrayList<JLabel> jlabels = new ArrayList<JLabel>();
ArrayList<JTextField> textFields = new ArrayList<JTextField>();
Я хочу добавить его в рамку и правильно упаковать эти элементы (см. Изображение).
Пожалуйста, посмотрите на часть моего кода:
public class ProductForm extends JFrame {
private JPanel contentPane;
public ProductForm() {
initComponents();
actions();
}
public void actions() {
setTitle("Product selection");
setSize(600, 350);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
private void initComponents() {
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
ArrayList<JLabel> jlabels = new ArrayList<JLabel>();
ArrayList<JTextField> textFields = new ArrayList<JTextField>();
//for (int a = 0; a < product.list.size(); a++) {
for (int a = 0; a < 7; a++) { // let say 7 for example
jlabels.add(new javax.swing.JLabel());
textFields.add(new javax.swing.JTextField());
for (JLabel j:jlabels) {
contentPane.add(j);
}
for (JTextField f:textFields) {
contentPane.add(f);
}
}
pack();
}
В результате у меня есть этот контент: пожалуйста, смотрите изображение ниже
Пожалуйста, помогите мне, как правильно упаковать эти элементы. Должен ли я инициализировать это каким-то образом?
Спасибо за любую помощь.
2 ответа
Решение
Попробуй это
private void initComponents() {
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new GridLayout(7, 2)); // 7 rows and 2 cols
setContentPane(contentPane);
ArrayList<JLabel> jlabels = new ArrayList<JLabel>();
ArrayList<JTextField> textFields = new ArrayList<JTextField>();
// for (int a = 0; a < product.list.size(); a++) {
for (int a = 0; a < 7.; a++) { // let say 7 for example
JLabel jLabel = new javax.swing.JLabel("New Label");
jlabels.add(jLabel);
JTextField jTextField = new javax.swing.JTextField();
textFields.add(jTextField);
contentPane.add(jLabel);
contentPane.add(jTextField);
}
pack();
}
Обновить
private void initComponents() {
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new GridBagLayout()); // 7 rows and 2 cols
setContentPane(contentPane);
GridBagConstraints constraints = new GridBagConstraints();
constraints.anchor=GridBagConstraints.NORTHWEST;
constraints.weightx=0.5;
constraints.weighty=0.5;
ArrayList<JLabel> jlabels = new ArrayList<JLabel>();
ArrayList<JTextField> textFields = new ArrayList<JTextField>();
// for (int a = 0; a < product.list.size(); a++) {
for (int a = 0; a < 7.; a++) { // let say 7 for example
JLabel jLabel = new javax.swing.JLabel("New Label");
constraints.gridx=0;
constraints.gridy=a;
jlabels.add(jLabel);
JTextField jTextField = new javax.swing.JTextField(10);
textFields.add(jTextField);
contentPane.add(jLabel, constraints);
constraints.gridx=1;
contentPane.add(jTextField, constraints);
}
pack();
}
Вы должны использовать правильный макет. Я предлагаю использовать GridLayout
,
Добавьте эту строку в свой initComponents()
метод:
contentPane.setLayout(new GridLayout(7,2)); // 7 rows, 2 columns
И измените ваш цикл на следующее:
for (int a = 0; a < 7; a++) {
jlabels.add(new javax.swing.JLabel());
textFields.add(new javax.swing.JTextField());
}
for (int i=0; i<7; i++) {
contentPane.add(jlabels.get(i));
contentPane.add(textFields.get(i));
}