Проблемы с позиционированием / макетом в JTextField - PullRequest
0 голосов
/ 21 ноября 2018

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

package com.main;

import java.awt.EventQueue;
import java.awt.TextField;

import javax.swing.JFrame;

public class classAddingDialog extends startingMenuWindow {

    private JFrame frame1;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    classAddingDialog window = new classAddingDialog();
                    window.frame1.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public classAddingDialog() {
        initialize();
    }

    private void initialize() {
        frame1 = new JFrame();
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        int count = 18,i;                                                                             //startingMenuWindow.countForNewClass;
        frame1.setBounds(100, 100, 450, 20+50*count/2+50);
        TextField[] nameInputs=new TextField[count];

        for(i=0;i<count;i++) {
            nameInputs[i]=new TextField();
            if(i<Math.ceil((double) count/2)) {
                nameInputs[i].setBounds(10, 10+50*i, 100, 30);
            }else {
                nameInputs[i].setBounds(180, (int) (10+50*(i-Math.ceil((double) count/2))), 100, 30);
            }
            nameInputs[i].setText(Integer.toString(i));
            frame1.add(nameInputs[i]);
        }
    }
}

Также не прикладывайте усилий к проверке позиции и границ последнего JTextField, которые я уже сделал, и функция

nameInputs[i].getBounds();

возвращает правильную позицию (где онадолжно быть), но на самом деле это просто охватывает все окно.

Если кто-то знает, в чем проблема, пожалуйста, сообщите мне.Заранее спасибо.

1 Ответ

0 голосов
/ 21 ноября 2018

Когда компоненты JTextField инициализируются, последний решает занять все окно.

Swing использует менеджеры компоновки.Диспетчером макета по умолчанию для панели содержимого JFrame является BorderLayout.Если вы не укажете ограничение, компонент будет добавлен в BorderLayout.CENTER фрейма.В ЦЕНТР можно добавить только один компонент, и это последний добавленный вами.Затем правила BorderLayout утверждают, что компонент в CENTER занимает все оставшееся пространство во фрейме.

Прочтите раздел из учебного пособия по Swing в Layout Manager для получения дополнительной информации и примеровиспользование BorderLayout.

Решение состоит в том, чтобы НЕ пытаться устанавливать границы ваших компонентов и вместо этого использовать менеджеры компоновки.

  1. Не используйте TextField, который является компонентом AWT.Вы должны использовать JTextField
  2. Когда вы создаете JTextField, используйте что-то вроде new JTextField(10).10 будет указывать количество символов «W», которые могут отображаться в текстовом поле одновременно.Это позволяет текстовому полю вычислять его предпочтительный размер, который затем может использоваться менеджерами компоновки.
  3. Не пытайтесь назначать границы текстового поля.Swing был разработан для использования с менеджером макета.Менеджер по расположению будет определять размер и расположение компонента на основе правил менеджера по расположению.
  4. Мне кажется, что вы пытаетесь отобразить текстовые поля в сетке из двух столбцов, так что вы можете использоватьпанель с GridLayout.См. Учебное пособие для примеров.

Итак, ваша базовая логика будет выглядеть примерно так:

JPanel grid = new JPanel( new GridLayout(0, 2) );

for(i = 0; i < count; i++) 
{
    JTextField textField = new JTextField(10);
    textField.setText( Integer.toString(i) );
    nameInputs[i] = textField();
    grid.add( textField ):
}

frame.add(grid);
frame.pack();
frame.setVisible( true );
...