我在向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页时它不会添加滚动。
答案 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。布局管理器将为您处理此问题。
一个工作示例如下:
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!
我想给你一些提示,以便你自己解决问题。
关于控制层次结构
我想推荐两种方式