Java JScrollPane滚动条不可滚动

Java JScrollPane滚动条不可滚动,java,swing,jframe,jscrollpane,jcomponent,Java,Swing,Jframe,Jscrollpane,Jcomponent,我有一个类,画一些非常简单的图形,如直线、圆和矩形。这些线可以动态扩展,有时当它们扩展到分辨率之外时,如果没有滚动条,就无法看到。因此,我将JScrollPane添加到我的JFrame中,但不幸的是,尽管已经调用了布局管理器,但滚动条不可滚动 以下是我所拥有的: -绘制组件(直线、矩形、圆)的类 -设置JFrame/JScrollPane的类 下面是我的GUI类的摘录代码: JFrame frame = new JFrame("GUIFrame"); frame.setLayou

我有一个类,画一些非常简单的图形,如直线、圆和矩形。这些线可以动态扩展,有时当它们扩展到分辨率之外时,如果没有滚动条,就无法看到。因此,我将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应该是可滚动的吗?不,因为绘制背景色是在背景中。实际视图没有改变,也不大于显示大小,因此滚动窗格看不到滚动的意义。您的绘制组件方法正在执行类似的操作。它只是在背景中画一些东西。实际视图没有更改,因此滚动窗格无法工作

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。