Вопрос

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

Теперь я хочу динамически добавить некоторые jTextFields в 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-приложений, поэтому мне наверняка не хватает чего-то очень простого, но я не понимаю, что именно.

Это было полезно?

Решение

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

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

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

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

Другие советы

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

РЕДАКТИРОВАТЬ:Да, я знал, что прошло слишком много времени с тех пор, как я занимался 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();

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

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

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

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

JTextField tf = new JTextField() ;
tf.setVisible(true) ;
panel.add(tf) ;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top