Добавление JTextField в JPanel и отображение их - PullRequest
7 голосов
/ 13 февраля 2009

Я создаю небольшое приложение с использованием 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-приложений, так что я, конечно, упускаю что-то очень простое, но не вижу, что.

Ответы [ 6 ]

6 голосов
/ 13 февраля 2009

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

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

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

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

2 голосов
/ 13 февраля 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();
0 голосов
/ 28 января 2012

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

0 голосов
/ 12 июня 2010

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

JTextField tf = new JTextField() ;
tf.setVisible(true) ;
panel.add(tf) ;
0 голосов
/ 13 февраля 2009

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

0 голосов
/ 13 февраля 2009

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

...