Java - 通过向父 JPanel 添加更多 JPanel 来自动滚动条

Java - Auto Scrollbar by adding more JPanels to parent JPanel

我正在创建一个类似应用程序的 Messenger,只是为了学习。我将 Parent JPanel 的布局设置为 GridLayout for Grid.

现在我希望 JPanel 在我添加更多超过父 JPanel 大小时的 JPanel 时显示 ScrollBar。

我尝试将它添加到 ScrollPane 但它不起作用 下面是示例图片,

抱歉,如果我的问题没有得到充分解释。如果需要,我会尽量解释更多。

我的看法是,在您的情况下,BoxLayoutY_AXISBorderLayout 内(带有小的 "trick")会更优雅。看看下面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));
    }
}

预览:

每个人都试图解决我的问题,但就我而言,这对我没有帮助。 所以我尽了一切可能。

因为我看到 JScrollPanelscrollBar 根据 JPanel 的大小出现,所以我尝试增加 JPanel 的大小,这解决了我的问题。以下是我所说内容的示例和解释。

将所有JPanels添加到parentJPanel后,我将parentJPanelheight配置为{[= parent 的 17=] JPanel + (child 的height JPanel * number of msgs)}

考虑以下代码:

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

这里的 -4JPanels 的默认数量,可以适应 parent JPanel

的默认大小