Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Добавление компонентов в JPanel


Автор: нуп 27.6.2011, 13:35
Есть JPanel, c 2 кнопками(ок, отмена).  Как можно динамически добавлять элементы(например JTextField) в панель, чтобы кнопочки были всегда внизу, а панель растягивалась по высоте?
user posted image
Сейчас сделал добавление тупо по setLocation
Код

 for(int i = 0; i < 4; i++) {
            JTextField o = new JTextField();
            panel.invalidate();
            panel.add(o);
            o.setSize(100, 20);
            o.setLocation(10, 25 * i + 5);
            o.setVisible(true);
        }

Как надо добавлять правильно?

Автор: jk1 27.6.2011, 14:34
Цитата

Как надо добавлять правильно?


Замените setLocation(...) на

Код

o.updateUI();


Если LayoutManager используется правильно, то должно сработать.

Автор: нуп 27.6.2011, 14:40
Цитата(jk1 @  27.6.2011,  14:34 Найти цитируемый пост)
Если LayoutManager используется правильно, то должно сработать.

а какой layout надо выставлять?

Автор: Stolzen 27.6.2011, 14:55
Например, GridLayout. Вот так:

Код

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class LayoutTest {
    
    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // в эту панель будем добавлять кнопки
        final JPanel topPanel = new JPanel(new GridLayout(0, 1));
        final JButton button = new JButton("Click Me");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                final JButton newButton = new JButton("Some button");
                topPanel.add(newButton);
                
                // перерисовываем
                frame.validate();
                frame.repaint();
                
                // меняем размер формы
                frame.pack();
            }
        });
        topPanel.add(button);
        
        // эта панель будет находится внизу
        final JPanel bottomPalel = new JPanel();
        bottomPalel.add(new JLabel("Some text on the bottom")); 
        
        // основная панель, в нее добавляем остальные
        Box panel = Box.createVerticalBox();
        panel.add(topPanel);
        panel.add(bottomPalel);
        
        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}


Автор: нуп 27.6.2011, 16:17
Почти получилось, осталась проблема с высотой. Что надо прописать для JPanel, чтобы он по мере добавления компонентов сам менял высоту? 
Код

public class TInput extends javax.swing.JPanel {
    final JPanel topPanel, bottomPanel, mainPanel;

    public TInput() {

        initComponents();

        mainPanel = new JPanel();
        bottomPanel = new JPanel(new FlowLayout());
        topPanel = new JPanel(new GridLayout(0, 1));
        bottomPanel.add(new JButton("Ok"));
        bottomPanel.add(new JButton("Cancel"));

        setLayout(new GridLayout(0, 1));
        add(mainPanel);
        mainPanel.setBackground(Color.white);

        Box panel = Box.createVerticalBox();
        mainPanel.add(panel);
        panel.add(topPanel);
        panel.add(bottomPanel);
        panel.setVisible(true);

        for (int i = 0; i < 10; i++) {
            JTextField o = new JTextField();
            topPanel.add(o);
            o.setSize(100, 20);
        }

    }

Вот так выходит, если менять количество JTextField
user posted image

Автор: Stolzen 27.6.2011, 16:29
Цитата(нуп @  27.6.2011,  17:17 Найти цитируемый пост)
Что надо прописать для JPanel, чтобы он по мере добавления компонентов сам менял высоту? 

Я делал так:
Цитата(Stolzen @  27.6.2011,  15:55 Найти цитируемый пост)
                // перерисовываем
                frame.validate();
                frame.repaint();
                
                // меняем размер формы
                frame.pack();

Подходит?

Если нет - тогда, думаю, ручками каждый раз увеличивать форму на 20 - если такая высота у добавляемого компонента. 
Типа frame.setSize() или this.setSize(), смотря какой у вас контейнер главный.
(Хотя мне этот вариант не очень нравится, но он должен работать)



Автор: нуп 27.6.2011, 16:36
Дело в том, что главный контейнер это JPanel, а для него нету pack()  smile  Наверное придется считать высоту самому 

Автор: jk1 27.6.2011, 23:26
Цитата

Наверное придется считать высоту самому 


А у него updateUI() вызывать не пробовали, по аналогии?

Автор: нуп 27.6.2011, 23:58
Вставил все в JFrame и заработало. Всем смс за помощь. smile 

Автор: Skipy 28.6.2011, 10:12
А что с этим JFrame будет при вставке 50 полей? 100?

Лучше поместить JPanel в JScrollPane и выставить окну оптимальные размеры.

Автор: нуп 28.6.2011, 10:17
Это для Popup окошка. На примере наследование идет от JFrame, или не правильно это?

Автор: jk1 28.6.2011, 15:24
Цитата

Это для Popup окошка. На примере наследование идет от JFrame, или не правильно это? 


Для popup я бы выбрал JDialog.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)