【问题标题】:Dynamically add fixed-height panels to a JScrollPane将固定高度的面板动态添加到 JScrollPane
【发布时间】:2015-03-02 10:50:47
【问题描述】:
JPanel panel = new JPanel(new GridLayout(0,1));
JScrollPane contentpane = new JScrollPane(panel);
JButton add  = new JButton("ADD");
add.actionListener(new ActionListener() {
     public void actionPerformed(){
          MyPanel newpanel = new MyPanel("title","Button"); //MyPanel is a class which extends JPanel and contains constructor MyPanel(String TitleToSet ,String ButtonTitleTOAdd)
           panel.add(newpanel);
           panel.repaint(); 
     }) ;

我使用此代码认为它会动态地将 MyPanel 添加到网格布局中,并且如果添加更多“MyPanel”,“面板”将是可滚动的。然而,情况并非如此,第一个“MyPanel”填满了整个“面板”,并且在添加第二个“MyPanel”时(通过单击“添加”按钮),第一个“MyPanel”被缩小以为添加第二个“MyPanel”腾出空间。 . 并且在添加更多内容时,所有“MyPanel”都适合视口而不是使“面板”可滚动。如何动态添加这些“MyPanel”并使“面板”在添加更多内容时可滚动?任何帮助将不胜感激。

【问题讨论】:

    标签: java swing jpanel jscrollpane


    【解决方案1】:

    http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html

    默认情况下,JScrollPane 使用 ScrollPaneLayout 来处理 它的子组件。 ScrollPaneLayout 确定要使 两种方式之一的视口视图:

    1. [...]
    2. 使用getPreferredSize。

    你应该添加行

    panel.setPreferredSize(new Dimension(0, panel.getComponents().size() * SUB_PANEL_HEIGHT));
    

    到您的 ActionListener。

    完整示例:

    package main;
    
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.Panel;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.Timer;
    
    class Test {
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setPreferredSize(new Dimension(400, 400));
            frame.setSize(400, 400);
            
            JPanel panel = new JPanel(new GridLayout(0, 1));
            panel.add(new JLabel("BOO"));
            panel.add(new JButton("BBBB"));
            
            JScrollPane contentpane = new JScrollPane(panel);
            frame.add(contentpane);
            
            new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JPanel newpanel = new JPanel();
                    newpanel.add(new JLabel("LOL"));
                    panel.add(newpanel);
                    System.out.println(100 * panel.getComponents().length);
                    panel.setPreferredSize(new Dimension(0, 100 * panel.getComponents().length));
                    contentpane.validate();
                }
            }).start();
            
            frame.setVisible(true);
        }
    }
    

    【讨论】:

    • 谢谢,效果很好,我什至尝试过使用绝对布局。但是当你设置首选尺寸时我不明白这部分,为什么你将面板的宽度设置为 0 ? [panel.setPreferredSize(new Dimension(0, 100 * panel.getComponents().length));]
    • JScrollPane 将视图宽度设置为 max(view.getPreferredSize().getWidth(), scrollPane.getWidth())。通过将视图的首选宽度设置为 0,我确保仅垂直滚动。
    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多