Java JScrollPane滚动条不可滚动
我有一个类,画一些非常简单的图形,如直线、圆和矩形。这些线可以动态扩展,有时当它们扩展到分辨率之外时,如果没有滚动条,就无法看到。因此,我将JScrollPane添加到我的JFrame中,但不幸的是,尽管已经调用了布局管理器,但滚动条不可滚动 以下是我所拥有的: -绘制组件(直线、矩形、圆)的类 -设置JFrame/JScrollPane的类 下面是我的GUI类的摘录代码:Java JScrollPane滚动条不可滚动,java,swing,jframe,jscrollpane,jcomponent,Java,Swing,Jframe,Jscrollpane,Jcomponent,我有一个类,画一些非常简单的图形,如直线、圆和矩形。这些线可以动态扩展,有时当它们扩展到分辨率之外时,如果没有滚动条,就无法看到。因此,我将JScrollPane添加到我的JFrame中,但不幸的是,尽管已经调用了布局管理器,但滚动条不可滚动 以下是我所拥有的: -绘制组件(直线、矩形、圆)的类 -设置JFrame/JScrollPane的类 下面是我的GUI类的摘录代码: JFrame frame = new JFrame("GUIFrame"); frame.setLayou
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应该是可滚动的吗?不,因为绘制背景色是在背景中。实际视图没有改变,也不大于显示大小,因此滚动窗格看不到滚动的意义。您的绘制组件方法正在执行类似的操作。它只是在背景中画一些东西。实际视图没有更改,因此滚动窗格无法工作
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(新的维度(长度,长度)),这样preferredSize在调用时始终是行的终点。这确保我已经覆盖了整个绘画区域,并且能够在需要时滚动。1)为了更快地获得更好的帮助,请发布一个。2)
comp.setPreferredSize(新尺寸(10001000));sp.validate()//sp.setPreferredSize(新尺寸(1000,1000))代码>3)frame.pack()代码>我认为您需要查看一下,以便更好地了解它们是如何工作的<代码>sp.setPreferredSize(新尺寸(10001000))
不会影响可滚动区域,但会影响组件的大小。视口
负责确定可滚动区域(至少从您试图实现的目标的角度来看)K的帮助,但我的印象是不鼓励使用setPreferredSize?“我的印象是不鼓励使用setPreferredSize”它是其中之一。有机会看到SSCCE吗?更好的建议来自可使用的代码。根据Andrew的建议,设计了一个简单的类来反映我正在做的事情。我将组件添加到JScrollPane sp=new JScrollPane(comp)中的滚动窗格中。为了在窗口中显示scoll窗格,我必须将滚动窗格添加到框架中,不是吗?我无法发现我做错了什么。首先设置组件的大小。所有绘制都将在该组件的大小矩形(剪辑区域)中进行。如果您尝试绘制超出此范围的任何内容,它将被忽略。它不会像您预期的那样滚动。我很抱歉。您使用JScrollPane的方式是正确的。我运行了您的代码,我想我知道了JScrollPane不起作用的原因。我尝试了getPreferredSize()很明显,它返回了0,0,这可能就是这个问题的原因。理论上,布局经理应该处理这个问题-我确实设置了布局经理,但由于某种原因它不起作用。@Xiaoerge你介意告诉我导致它不起作用的错误在哪里吗?@Xiaoerge我不得不承认这有点像c在那里融合。我如何改变“实际视图”,而不是仅仅在背景中绘制?相反,按照建议重写getPreferredSize()
。在paintComponent()中添加了一个setPreferredSize(新的尺寸(长度,长度),非常臭,同时违反了两个基本规则:a)在绘制循环期间,切勿更改中组件的状态b)根本不要调用setPreferredSize。