将滚动添加到JPanel

时间:2016-03-02 16:27:06

标签: java swing scroll jpanel

我在向JPanel添加滚动条时遇到问题。这是我的代码,但它不起作用!我需要帮助!

public class DocumentView extends JPanel implements EventListener,MouseListener{

    public String name;
    private Document document;
    private Dimension dim;
    public DocumentView dv;

    JScrollPane scrollPane = new JScrollPane(dv,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);


    public boolean selected = false;

    public DocumentView() {
        setBackground(Color.GRAY);
        this.add(scrollPane);
        setVisible(true);

        addMouseListener(this); //za kontra focus
    }  
}

什么不起作用

它应该是一个文档,你可以在其中添加页面...所以当我在一个文档中添加超过2页时,它不能显示所有它只是添加它们但我无法看到它们。 ..这就是我需要滚动条....不工作,我的意思是当我添加超过2页时它不会添加滚动。

3 个答案:

答案 0 :(得分:2)

在您的代码中,每个DocumentView内都有另一个DocumentView面板,您要将滚动窗格添加到实例dv,而不是将其添加到DocumentView本身。< / p>

如果要将滚动窗格添加到DocumentView本身,则应该是:

//Change "dv" to "this"
JScrollPane scrollPane = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

如果您确实要将滚动窗格添加到实例dv,我没有看到您将dv添加到当前的JPanel中。

我不确定为什么在DocumentView中需要另一个DocumentView实例。如果在构造函数中初始化dv,请注意StackOverFlowError

public DocumentView(){
    dv = new DocumentView();
    this.add(dv);  //Causes Stack Overflow error
}

答案 1 :(得分:2)

添加滚动条时,您需要一个面板和一个滚动窗格:

scrollPanel = new JPanel();
scrollPane = new JScrollPane(scrollPanel);

从现在开始,添加到scollPanel的组件将创建一个滚动条(垂直和/或水平)。添加新组件时,滚动条将自动调整其高度,因为在添加/删除新组件时(如果使用布局),scollPanel(JPanel)将调整其preferredSize。布局管理器将为您处理此问题。

enter image description here

一个工作示例如下:

class MainPanel extends JPanel{

    private JScrollPane scrollPane;
    private JPanel scrollPanel;
    private JButton btnAddPage;

    public MainPanel(){
        setPreferredSize(new Dimension(400, 140));
        setLayout(new BorderLayout());
        initComponents();
    }

    private void initComponents(){
        scrollPanel = new JPanel();
        scrollPanel.setSize(new Dimension(300, 300));       
        scrollPane = new JScrollPane(scrollPanel);  //Let all scrollPanel has scroll bars

        btnAddPage = new JButton("Add New Page");
        btnAddPage.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                addPanel(new Page());
                scrollPanel.revalidate();
            }
        });     

        add(scrollPane, BorderLayout.CENTER);
        add(btnAddPage, BorderLayout.SOUTH);                
    }

    public void addPanel(JPanel pnl){
        scrollPanel.add(pnl);
    }
}

用于模拟您要添加的页面的Page类:

class Page extends JPanel
{
    private static int idx = 1;
    private JLabel pageContent;
    public Page(){
        setPreferredSize(new Dimension(80, 80));
        setBackground(Color.YELLOW);
        pageContent = new JLabel("Page " + (idx++));
        add(pageContent);
    }
}

用于驱动代码的跑步者类:

class ScrollPaneDemo{
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                JFrame frame = new JFrame("Scrollable Panel");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new MainPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);                 
            }   
        });     
    }
}

PS:处理滚动条时,您可能需要仔细选择布局,您选择的布局将直接决定面板的尺寸,甚至是您添加的组件,最终会影响滚动窗格的效果。

答案 2 :(得分:0)

欢迎使用StackOverflow!

我想给你一些提示,以便你自己解决问题。

  • dv 的值在传递给JScrollPane的构造函数时为空
  • 查看控件层次结构。您正在为DocumentView创建一个类,该类将包含一个包含DocumentView的JScrollPane。我假设你想让你的DocumentView可滚动。考虑将整个控件包装在一个独立的JScrollPane(更高级别)中。
  • 提示:尝试将每个实例变量(也称为&#34;字段&#34;)设置为私有。公共领域非常罕见。

关于控制层次结构

我想推荐两种方式

  1. 专用控件:您可以创建一个dedidcated Document-和PageView类。 DocumentView可以从JPanel继承并包含JScrollPane。 JScollPane使用FlowLayout(垂直)包装另一个JPanel。每次将新页面添加到DocumentView时,它都会创建一个新的PageView实例,并将其添加到包含在JScrollPane中的JPanel中。 PageView只显示内容。
  2. 假设您拥有无限空间:这是大多数Swing组件的设计方式。创建一个假定存在无限空间的DocumentView。只需垂直对齐每个页面(一个接一个)。然后,您应该覆盖 getPreferredSize 方法并返回控件占用的大小。不,你可以简单地将整个DocumentView包装在JScrollPane中。