我已经看过许多假设让JPanel能够在JScrollPane中滚动的例子,但是在我的情况下没有一个实现工作。我的JPanel比JScrollPane大,但是当我运行它时,滚动条并没有相应地反映到JPanel的大小。
ePanel = new EnvironmentPanel(); // class that extends JPanel
environmentSP = new JScrollPane(ePanel.getPanel());
environmentSP.setPreferredSize(new Dimension(1235, 780));
environmentSP.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
environmentSP.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
environmentSP.setViewportView(ePanel.getPanel());
this.frame.getContentPane().add(splitPane, BorderLayout.CENTER);
this.frame.getContentPane().add(environmentSP, BorderLayout.EAST);
splitPane.setRightComponent(environmentSP);
答案 0 :(得分:1)
我们无法在没有猜测的情况下回答您的问题,因为您没有发布minimal runnable example program,但无论如何我都会猜测。我的猜测是这个假设:
我的JPanel大于JScrollPane
实际上是假的。找出你自己 - 调试你的代码并打印出构成组件的大小,包括JScrollPane持有的JPanel,ePanel.getPanel()
,以及JScrollPane本身在组件呈现后 当然,你会看到。
例如,我所做的是将println语句放在paintComponent覆盖中,如:
public class MyPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.printf("Panel Size: [%d, %d]%n", getWidth(), getHeight());
}
}
这将告诉您完全组件的大小在呈现时。在setPreferredSize(...)
修复之前执行此操作,您将看到有时最好的调试方法是抛弃所有假设,而是测试以查看运行代码中实际发生的情况。