【问题标题】:JScrollPane doesn't show scroll bars when JPanel is added添加 JPanel 时 JScrollPane 不显示滚动条
【发布时间】:2014-08-29 14:53:01
【问题描述】:

我尝试使用以下方法将 JPanel 添加到 JScrollPane:

    panel1 Panel1 = new panel1(); 
    jScrollPane1.setViewportView(Panel1);

它奏效了。但问题是即使 Panel1 更大,scrollPane 也不显示滚动条。 (我正在使用 NetBeans & panel1 是一个 jpanel 表单)

【问题讨论】:

    标签: java swing jpanel jscrollpane preferredsize


    【解决方案1】:

    Override,getPreferredSize() 方法为表示JScrollPane,你也许能看到滚动条。或者可以简单地调用setPreferredSize(),尽管如 API 中所述

    设置此组件的首选大小。如果preferredSize 为null,UI 将被要求提供首选尺寸

    覆盖将是有益的,因为它倾向于为所述JComponent定义一些适当的维度。

    类似这样的:

    JScrollPane scroller = new JScrollPane() {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 200);
        }
    };
    scroller.setViewportView(panelWithScroll);
    

    一个例子:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class PanelScroller {
    
        private void displayGUI() {
            JFrame frame = new JFrame("Swing Worker Example");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            JPanel contentPane = new JPanel();
            JPanel panelWithScroll = new JPanel();
            panelWithScroll.setLayout(new GridLayout(0, 1, 5, 5));
            JScrollPane scroller = new JScrollPane() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(300, 200);
                }
            };
            scroller.setViewportView(panelWithScroll);
            //scroller.setPreferredSize(new Dimension(300, 200));
    
            for (int i = 0; i < 20; i++) {
                panelWithScroll.add(new JLabel(Integer.toString(i + 1), JLabel.CENTER));
            }
    
            contentPane.add(scroller);
    
            frame.setContentPane(contentPane);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    new PanelScroller().displayGUI();
                }
            };
            EventQueue.invokeLater(runnable);
        }
    }
    

    【讨论】:

    • 我都试过了,调用 setPrefferedSize() 和覆盖 getPrefferedSize() 但没有奏效。然后我尝试将面板的布局更改为 GridLayout 并且效果很好。(也适用于 AbsoluteLayout 和 FreeDesign)感谢您的帮助。
    • 我不确定 NetBeans使用的默认值是什么(我猜是 GroupLayout,我不熟悉,因为之前从未在任何 IDE 上工作过)LayoutManager >,这可能是导致问题的原因,因为上面发布的示例也清楚地展示了我所指的内容。
    【解决方案2】:

    如果你只想显示滚动条,你可以调用

    JScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    JScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    

    但这根本无法让它们发挥作用。

    如果您不想让它们工作,您可以尝试将 Scrollpane 内组件的首选大小设置为大于 Scrollpane 的大小,然后调用 repaint(例如,通过使窗口全屏)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多