2009-02-13 2 views
7

Я создаю небольшое приложение, использующее Java и Swing в NetBeans. Используя окно проектирования NetBeans, я создал JFrame с JPanel внутри.Добавление JTextField в 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(); 

Но ничего не происходит: когда я запустить приложение, фрейм показывает с JPanel внутри, но JTextFields нет.

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

ответ

6

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

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

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

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

+0

Я отбросил все классы, созданные из NetBeans, и я написал свои собственные JPanels, и теперь все работает так, как я имел в виду. Спасибо за то, что указали мне в нужном направлении :) –

0

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

+0

В фактическом коде петля правильная, я редактирую вопрос, чтобы избежать путаницы :) –

+0

Составимый код был бы полезен ... –

2

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

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

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

validate будет делать то же самое, что и пакет. –

+1

Проверка делает это (но без изменения размера). –

0

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

-3

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

JTextField tf = new JTextField() ; 
tf.setVisible(true) ; 
panel.add(tf) ; 
+0

неправильно - видимое свойство по умолчанию истинно, не нужно его устанавливать ... – kleopatra

0

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

Смежные вопросы