2016-12-01 2 views
2

Я добавляю компоненты в JPanel, который установлен как FlowLayout, они не перемещаются по следующей строке, даже если в этой строке нет свободного места. Here is the screenshot of the problemКак переместить компоненты в следующую строку в FlowLayout?

import javax.swing.*; 
import java.awt.*; 
import javax.swing.border.BevelBorder; 
import javax.swing.border.TitledBorder; 
public class GUI extends JFrame 
{ 
    private JLabel jlfname; 
    private JPanel p1; 
    private JTextField t1; 
    private JLabel jllname; 
    private JTextField t2; 
    private JLabel jltitle; 
    private JTextField t3; 
    GUI() 
    { 
     jlfname=new JLabel("First Name : "); 
     p1=new JPanel(); 
     TitledBorder titled = new TitledBorder("Name"); 
     p1.setBorder(titled); 
     t1=new JTextField(10); 
     jllname=new JLabel("Last Name : "); 
     t2=new JTextField(10); 
     jltitle=new JLabel("Title : "); 
     t3=new JTextField(10); 
     //Add in Pannel 
     p1.setLayout(new FlowLayout()); 
     p1.add(jlfname); 
     p1.add(t1); 
     p1.add(jllname); 
     p1.add(t2); 
     p1.add(jltitle); 
     p1.add(t3); 
     //Add in Frame 
     add(p1); 
     setSize(550,500); 
     setTitle("JFrame Tutorial"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new FlowLayout(FlowLayout.LEFT)); 
     setResizable(false); 
     setVisible(true); 
    } 
    public static void main(String [] args) 
    { 
     new GUI(); 
    } 
} 

Я также попытался установить ширину панели, но она не работает!

ответ

3

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

setLayout(new FlowLayout(FlowLayout.LEFT)); 

Вы переопределение менеджер компоновки по умолчанию кадра, так что теперь рамка будет соблюдать предпочтительный размер панели добавлен к раме, что означает, что все компоненты будут отображаться на одной строке.

Избавиться от этого утверждения.

Теперь компоненты смогут обертывать доступное пространство, поскольку по умолчанию панель будет добавлена ​​в BorderLayout.CENTER, которая занимает все пространство, доступное в кадре.

Однако указанное выше решение будет работать только при добавлении компонентов в ЦЕНТР BorderLayout. Обычно вы не должны использовать setSize(), но вместо этого используйте pack() для всего кадра для отображения по своему предпочтительному размеру.

Для более гибкого макета, который рассчитает правильный предпочтительный размер панели, проверьте Wrap Layout. Этот класс расширяет FlowLayout для вычисления предпочтительного размера.

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