JScrollPane滚动条不可滚动

我有一个类绘制一些非常简单的图形,如线条,圆形和矩形。 线条是动态可扩展的,有时当它们超出分辨率时,如果没有滚动条,就无法看到。 因此,我已将JScrollPane添加到我的JFrame中,但不幸的是,尽管已经调用了布局管理器,但滚动条仍无法滚动。

这就是我所拥有的: – 绘制组件(线,矩形,圆圈)的类 – 设置JFrame / JScrollPane的类

这是我的GUI类的摘录代码:

JFrame frame = new JFrame("GUIFrame"); frame.setLayout(new BorderLayout()); // Layout already set frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DrawComponent comp = new DrawComponent(); // Reference to class that draw components JScrollPane sp = new JScrollPane(comp, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); sp.setPreferredSize(new Dimension(1000, 1000)); frame.add(sp, BorderLayout.CENTER); frame.setSize(500,500); frame.setVisible(true); 

使用上面的代码,我有Java向我展示一个包含我的jcomponents的滚动窗口的JFrame。 我已将滚动条设置为始终如上所示,但它们不可滚动,灰色显示。

正如Andrew所说,我花了一些时间来创建一个SSCCE来反映我正在尝试做的事情:

 import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Line2D; import java.util.Random; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; public class DrawTest { public static void main(String[] args){ JFrame frame = new JFrame("SSCCE"); frame.setLayout(new BorderLayout()); frame.setSize(1000, 1000); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DrawComp d = new DrawComp(); JScrollPane sp = new JScrollPane(d, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); frame.add(sp); frame.setVisible(true); } } class DrawComp extends JComponent { public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; Random ran = new Random(); int ranNum = ran.nextInt(10); System.out.println(ranNum); double length = 100 * ranNum; g2.draw(new Line2D.Double(10, 10, length, length)); } } 

上面的代码根据随机输入绘制对角线。 我打算做的是,当线条长度超出帧大小时,我希望我能够滚动并查看整行。 我再次将行组件添加到JScrollPane但它不能滚动。

我很抱歉。 您正在以正确的方式使用JScrollPane。 我运行了你的代码,我想我得到了JScrollPane不工作的原因。 想象一下,当你将jframe的背景设置为全红色时(通过在任何地方涂上一个红点),jscrollpane是否可以滚动? 不,因为绘制背景颜色是在背景中。 实际的VIEW没有变化,它不会大于显示尺寸,因此滚动窗格看不到滚动点。 你的paint组件方法正在做类似的事情。 它只是在后台绘制一些东西。 实际的VIEW没有改变,所以scrollpane不会工作。

 public class DrawTest { public static void main(String[] args){ JFrame frame = new JFrame("SSCCE"); frame.setLayout(new BorderLayout()); frame.setSize(500, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final DrawComp d = new DrawComp(); final JScrollBar hbar,vbar; hbar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 500); vbar = new JScrollBar(JScrollBar.VERTICAL, 0, 1, 0, 500); frame.setLayout(null); frame.add(d); frame.add(hbar); frame.add(vbar); d.setBounds(0, 0, 300, 300); vbar.setBounds(460, 0, 20, 480); frame.setVisible(true); vbar.addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { d.setLocation(d.getX(), -vbar.getValue()); } }); } } 

以下是垂直滑动组件的代码。 我对您现有的代码进行了一些更改。 DrawComp仍然是相同的

我找到了解决问题的临时解决方案。 鉴于绘图有多简单,我决定使用该行的终点来覆盖preferredSize。

与上面发布的SSCCE有关,我在paintComponent()中添加了一个setPreferredSize(新的Dimension(长度,长度) ,以便在调用它时,preferredSize将始终是该行的终点。这可以确保我得到了如果需要的话,画面的整个区域都可以覆盖并且能够滚动。