Добавление JTextField в JPanel и их отображение

Я создаю небольшое приложение, используя Java и Swing в NetBeans. Используя окно дизайна NetBeans, я создал JFrame с JPanel внутри.

Теперь я хочу динамически добавить несколько jTextField в JPanel. Я написал что-то вроде этого:

Vector textFieldsVector = new Vector();
JTextField tf;
int i = 0;
while (i < 3) {
    tf = new JTextField();
    textFieldVector.add(tf);
    myPanel.add(tf); //myPanel is the JPanel where I want to put the JTextFields
    i++;
}
myPanel.validate();
myPanel.repaint();

Но ничего не происходит: когда я запускаю приложение, отображается JFrame с JPanel внутри, а JTextFields — нет.

Я новичок в написании графических Java-приложений, поэтому мне, конечно, не хватает чего-то очень простого, но я не понимаю, что.


person Davide Gualano    schedule 13.02.2009    source источник


Ответы (6)


В графическом интерфейсе Netbeans установите для диспетчера компоновки что-то вроде GridLayout или FlowLayout (просто для тестирования). Вы можете сделать это, перейдя в редактор графического интерфейса, щелкнув панель, а затем щелкнув правой кнопкой мыши и выбрав макет.

После того, как вы перешли на другой макет, перейдите к свойствам и измените свойства макета. Для GridLayout вы хотите убедиться, что у вас есть 3 ячейки сетки.

Вместо myPanel.validate() попробуйте myPanel.revalidate().

Более канонический способ сделать это — создать пользовательскую панель JPanel (без использования графического редактора), которая устанавливает свой собственный менеджер компоновки, заполняет себя компонентами и т. д. Затем в графическом редакторе Netbeans перетащите эту пользовательскую панель JPanel. в графический редактор. Matisse, безусловно, способен обрабатывать изменения компонентов Swing во время выполнения, но это не обычный способ его использования.

person James Schek    schedule 13.02.2009
comment
Я отбросил все классы, сгенерированные из NetBeans, и написал свои собственные JPanels, и теперь все работает так, как я имел в виду. Спасибо, что указали мне правильное направление :) - person Davide Gualano; 15.02.2009

Прошло некоторое время с тех пор, как я сделал некоторые Swing, но я думаю, что вам нужно будет вспомнить pack(), чтобы сказать фрейму ретранслировать свои компоненты.

РЕДАКТИРОВАТЬ: Да, я знал, что прошло слишком много времени с тех пор, как я занимался Swing. Я набросал следующий код, который работает, как и ожидалось, и добавляет текстовые поля...

    JFrame frame = new JFrame("My Frame");
    frame.setSize(640, 480);
    JPanel panel = new JPanel();
    panel.add(new JLabel("Hello"));
    frame.add(panel);
    frame.setLayout(new GridLayout());
    frame.pack();
    frame.setVisible(true);
    Vector textFieldVector = new Vector();
    JTextField tf;
    int i = 0;
    while (i < 3) {
        tf = new JTextField();
        textFieldVector.add(tf);
        panel.add(tf); //myPanel is the JPanel where I want to put the JTextFields
        i++;
    }
    panel.validate();
    panel.repaint();
person tddmonkey    schedule 13.02.2009
comment
validate будет делать то же самое, что и pack. - person Paul Tomblin; 13.02.2009
comment
Проверка делает это (но без изменения размера). - person Tom Hawtin - tackline; 13.02.2009

Ваш цикл while неверен. i никогда не увеличивается, поэтому создание вашего окна находится в бесконечном цикле, а потребление вашего ЦП должно быть на 100%, пока вы не прервете программу. Кроме того, графический интерфейс должен полностью не реагировать при запуске вашей программы.

person Bombe    schedule 13.02.2009
comment
В реальном коде цикл правильный, я редактирую вопрос, чтобы избежать путаницы :) - person Davide Gualano; 13.02.2009

Обычный способ использования GroupLayout — добавить компонент в Group. GroupLayout хранит ссылку на Container, за который он отвечает (что имеет смысл). Вы не должны добавлять компонент на панель без ограничений.

person Tom Hawtin - tackline    schedule 13.02.2009

Не используйте GroupLayout с новым (динамически добавленным) компонентом. Он не появится.

person Raymond Gao    schedule 27.01.2012

Просто используйте метод .setVisible() JTextField:

JTextField tf = new JTextField() ;
tf.setVisible(true) ;
panel.add(tf) ;
person Cork    schedule 12.06.2010