Java - автоматическая полоса прокрутки путем добавления дополнительных JPanels к родительскому JPanel - PullRequest
0 голосов
/ 29 января 2019

Я создаю приложение, похожее на Messenger, только для обучения.Я установил макет Parent JPanel на GridLayout для Grid.

Теперь я хочу, чтобы JPanel показывал ScrollBar, когда я добавляю больше JPanels, которые превышают размер родительского JPanel.

Я попытался добавить его в ScrollPane, но он не работает. Ниже приведен пример изображения,

Извините, если мой Вопрос не полностью объяснен.Я постараюсь объяснить это больше, если необходимо.

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Все пытались решить мою проблему, но в моем случае это мне не помогло.Поэтому я попробовал все, что мог.

Как я увидел, scrollBar из JScrollPanel появляется в соответствии с размером JPanel, поэтому я попытался увеличить размер JPanel, и это решило мою проблему.проблема.Ниже приведен пример и объяснение того, что я сказал.

После добавления всех JPanels в родительский JPanel я настроил height родительского JPanel в {height родительского JPanel + (height потомка JPanel * number of msgs)}

рассмотрите следующий код:

msgPanel.setPreferredSize(new Dimension(268,418+(new msg().getPreferredSize().height*(msgs.length-4)));

здесь -4 - это номер по умолчанию JPanels это может соответствовать размеру родительского элемента по умолчанию JPanel

0 голосов
/ 29 января 2019

То, как я это вижу, в вашем случае BoxLayout с Y_AXIS внутри BorderLayout (с небольшим "трюком") будет более элегантным.Взгляните на следующее SSCCE: Есть строка комментария, чтобы ответить на ваш вопрос, с разметкой сетки.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.border.LineBorder;

public class ChatFrame extends JFrame {
    static int x = 1;

    public ChatFrame() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500, 500);
        setLocationRelativeTo(null);

        getContentPane().setLayout(new BorderLayout());
        JPanel gridPanel = new JPanel(new GridLayout(0, 1));
        // Comment the following line to see behavior with grid layout
        gridPanel.setLayout(new BoxLayout(gridPanel, BoxLayout.Y_AXIS));

        final JScrollPane sp = new JScrollPane(gridPanel);
        getContentPane().add(sp);

        final String helloWorld = "Hello world, ";
        Timer t = new Timer(1000, e -> {
            ChatPanel cp = new ChatPanel(helloWorld + (x++));
            gridPanel.add(cp);
            // Scroll to the last chat.
            sp.getVerticalScrollBar().setValue(sp.getVerticalScrollBar().getMaximum());
            gridPanel.repaint();
            gridPanel.revalidate();
        });
        t.start();
    }

    private static class ChatPanel extends JPanel {
        public ChatPanel(String chat) {
            super(new BorderLayout());
            setBorder(new LineBorder(Color.red));
            JLabel chatLabel = new JLabel(chat);
            add(chatLabel, BorderLayout.CENTER);
            // a kind of "trick"
            setMaximumSize(new Dimension(getMaximumSize().width, getPreferredSize().height));
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ChatFrame().setVisible(true));
    }
}

Предварительный просмотр:

enter image description here

...