【问题标题】:Java - Auto Scrollbar by adding more JPanels to parent JPanelJava - 通过向父 JPanel 添加更多 JPanel 来自动滚动条
【发布时间】:2019-06-22 06:44:20
【问题描述】:

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

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

我尝试将它添加到 ScrollPane 但它不起作用 波纹管是一个示例图像,

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

【问题讨论】:

  • 您必须设置添加到滚动窗格的 jpanel 的大小以使其可滚动。尝试将 jpanel 的大小设置为大于滚动窗格的大小。
  • "如果需要,我会尽力解释。"问题很清楚。请发布您的代码以查看您的尝试。
  • 查看使用JScrollpanehere的示例
  • 顺便说一句——看到这张图片,我首先想到的是JList。使用适当的渲染组件,它可以轻松显示Message对象。

标签: java swing jpanel jscrollpane


【解决方案1】:

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

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

将所有JPanels 添加到父JPanel 后,我将父JPanelheight 配置为父JPanel 的{height + (height 的子JPanel * @ 987654333@)}

考虑以下代码:

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

这里-4JPanels 的默认数量,它可以适应父JPanel 的默认大小

【讨论】:

    【解决方案2】:

    在我看来,在您的情况下,BoxLayoutBorderLayout 内的 Y_AXIS(带有一个小“技巧”​​)会更优雅。看看下面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));
        }
    }
    

    预览:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多