JPanel FlowLayout Force Компонентная обертка

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

Я читал, что если бы я использовал BoxLayout, я мог бы вставить что-то вроде component return key и заставить компоненты начинаться с новой строки. Мне нужно руководство относительно моего решения и какой подход является лучшим.

У меня есть JLabel и JTextField в одной строке, и я хотел бы поместить JTextArea внутри JScrollPane ниже.


person Mushy    schedule 10.01.2014    source источник


Ответы (1)


  • Используйте комбинацию FlowLayout и BorderLayout. Рекомендуется вкладывать макеты, чтобы получить желаемый результат.
  • JLabel и JTextField пойдут в один JPanel с FlowLayout
  • Затем другой JPanel с BorderLayout будет удерживать предыдущую панель в позиции NORTH, а JTextArea с JScrollPane в позиции CENTER.

    JPanel topPanel = new JPanel();
    JLabel label = new JLabel("Text Field Label");
    JTextField jtf = new JTextField(20);
    topPanel.add(label);
    topPanel.add(jtf);
    
    JPanel bothPanel = new JPanel(new BorderLayout());
    JTextArea jta = new JTextArea(20, 40);
    bothPanel.add(topPanel, BorderLayout.NORTH);
    bothPanel.add(new JScrollPane(jta));
    

Ознакомьтесь с Размещение компонентов внутри контейнера

введите здесь описание изображения

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FlowBorderDemo {

    public FlowBorderDemo() {
        JPanel topPanel = new JPanel();
        JLabel label = new JLabel("Text Field Label");
        label.setForeground(Color.white);
        JTextField jtf = new JTextField(20);
        topPanel.add(label);
        topPanel.add(jtf);
        topPanel.setBackground(Color.black);


        JPanel bothPanel = new JPanel(new BorderLayout());
        JTextArea jta = new JTextArea(20, 40);
        JScrollPane scrollPane = new JScrollPane(jta);
        scrollPane.setBorder(BorderFactory.createMatteBorder(3, 0, 0, 0, Color.GRAY));
        bothPanel.add(topPanel, BorderLayout.NORTH);
        bothPanel.add(scrollPane);
        bothPanel.setBorder(BorderFactory.createMatteBorder(3, 8, 3, 8, Color.GRAY));

        JLabel copyLabel = new JLabel("<html>&copy;2014 peeskillet</html>");
        copyLabel.setBackground(Color.LIGHT_GRAY);
        copyLabel.setHorizontalAlignment(JLabel.CENTER);
        bothPanel.add(copyLabel, BorderLayout.PAGE_END);


        JFrame frame = new JFrame();
        frame.add(bothPanel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager
                            .getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException
                        | IllegalAccessException
                        | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                new FlowBorderDemo();
            }
        });
    }
}
person Paul Samsotha    schedule 11.01.2014
comment
Спасибо @peeskillet. Я никогда не думал просто умножать количество панелей и играть с менеджерами компоновки. Однако как я могу принудительно обернуть компонент в том же менеджере компоновки? - person Mushy; 11.01.2014
comment
@Mushy, что именно ты пытаешься обернуть? - person Paul Samsotha; 11.01.2014
comment
Я хочу остаться в FlowLayout и обернуть JScrollPane под JLabel и JTextField, не играя с дополнительными панелями и менеджерами компоновки. - person Mushy; 11.01.2014
comment
@Mushy, вы можете вложить множество панелей и макетов, если хотите получить желаемый результат. Обертывание может не всегда давать желаемый результат. Например, если вам нужны некоторые компоненты под панелью с текстовым полем, вы можете создать другую панель с BoxLayout и добавить панель текстового поля и еще одну панель к BoxLayout, а затем поместить эту панель BoxLayout в позицию NORTH в приведенном выше коде. Просто продолжайте вкладывать панели, чтобы получить желаемый результат. - person Paul Samsotha; 11.01.2014
comment
@Mushy, это вообще не даст желаемого результата. если пользователь расширит экран, то текстовая область появится справа от метки и текстового поля. И если вы сделаете экран неизменяемым, это лишает вас цели того, что вы пытаетесь сделать. - person Paul Samsotha; 11.01.2014