【问题标题】:JScrollPane does not appear when using it on a JPanelJScrollPane 在 JPanel 上使用时不会出现
【发布时间】:2012-06-13 07:05:32
【问题描述】:

我已经尝试了几个小时来找到解决问题的方法,但我没有运气。这是一个示例代码:

import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class Example extends JFrame
{
    private static final long serialVersionUID = 1L;

    public Example()
    {
        JPanel contentPane = (JPanel) getContentPane();
        contentPane.setLayout(new BorderLayout());

        JPanel panTop = new JPanel(new BorderLayout());
        //JPanel panBottom = new JPanel(new BorderLayout());

        JPanel panTopCenter = new JPanel();
        //JPanel panTopLeft = new JPanel();
        //JPanel panTopRight = new JPanel();

        panTop.add(panTopCenter, BorderLayout.CENTER);
        //panTop.add(panTopLeft, BorderLayout.WEST);
        //panTop.add(panTopRight, BorderLayout.EAST);

        contentPane.add(panTop, BorderLayout.CENTER);
        //contentPane.add(panBottom, BorderLayout.SOUTH);

        JPanel pan = new JPanel();
        pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS));
        for(int i = 0; i < 50; i++) pan.add(new JButton("Button " + i));
        JScrollPane scrollPane = new JScrollPane(pan);
        panTopCenter.add(scrollPane);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {           
            @Override
            public void run()
            {
                new Example();
            }
        });
    }
}

快照:

【问题讨论】:

  • 不要使用BoxLayout,而是尝试GridLayout,如example所示,因为在GridLayout中,所有JButtons将具有相同的大小,与BoxLayout不同,其中大小由其中的文本决定。

标签: java swing jpanel jscrollpane layout-manager


【解决方案1】:

我总是必须像这样设置视口的首选大小。

import java.awt.*;
import javax.swing.*;

public class Example extends JFrame {

    public Example() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        Box box = new Box(BoxLayout.Y_AXIS);
        for (int i = 0; i < 50; i++) {
            box.add(new JButton("Button " + i));
        }
        JScrollPane sp = new JScrollPane(box);
        Dimension d = new Dimension(box.getComponent(0).getPreferredSize());
        sp.getVerticalScrollBar().setUnitIncrement(d.height);
        d.height *= 10; // Show at least 10 buttons
        sp.getViewport().setPreferredSize(d);

        add(sp, BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                Example e = new Example();
            }
        });
    }
}

【讨论】:

  • 你也可以实现Scrollable
【解决方案2】:

不要设置任何尺寸!如果进行此更改,则会出现滚动条。

JPanel panTopCenter = new JPanel(new GridLayout());

基本问题是FlowLayout 将以显示它所需的最小尺寸显示组件,对于滚动窗格,即(决定为)0x0。通过在构造函数中使用不带参数的GridLayout 并将滚动窗格添加为唯一组件,它将被强制填充可用空间。

【讨论】:

  • +1 IIUC,问题是生成的视口首选大小笨重并且(可能)依赖于 L&F。我会提倡实施getPreferredScrollableViewportSize()
  • @trashgod 我可以看到可能需要设置首选视口大小的情况,但对于“设置 any 大小”始终非常谨慎。这是我在用尽其他可能的可能性之后才考虑的事情。
  • @both 我承认,我不太明白这个问题 +1 可能是正确的答案
  • @mKorbel “我不太了解这个问题” 这是一个问题的答案在于无法立即知道的细节。我通常会在 GUI 的其余部分使用元素来形成“合理的大小”(基于列/行等),并将这些大小提示用于 GUI 的另一个区域中的可滚动组件(或列表)我们有很多这些类型的组件/元素。事实上,即使使用列表 (JList),我们也可以建议行大小,这样也有帮助。
  • aaaachhhh 我明白了,确保我的错误'cos 1) 默认情况下从问题中删除压载物,然后再创建我的答案 2) 仅返回有关 L&F、UIManager 和最后 2M 的问题以比较混乱来自 Java7(I think that not correct answer,但以有限的形式工作,例如示例)3) 从未使用过 FlowLayout / BoxLayout
【解决方案3】:

如果JScrollPane在容器或顶级容器中是单个JComponent,则必须设置首选大小。

scrollPane.setPreferredSize(new Dimension(100,500));

最好将GridLayout 用于相同类型的JComponents。

【讨论】:

  • 但是当我这样做时,panTopCenter 将具有静态大小,并且不会在扩大 JFrame 大小时动态放大。
  • 我想你可以像here一样改变视口的大小。
  • 啊,类似于setVisibleRowCount()JList所做的,如图here
【解决方案4】:

最好的解决方案是使用来自 SwingX 的JXPanel,快速简单,这是准标准的并实现了Scrollable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多