当前位置: 首页 > 知识库问答 >
问题:

JScrollPane滚动条不可滚动

白念
2023-03-14

我有一个类可以画一些非常简单的图形,比如直线、圆和矩形。线条可以动态扩展,有时当它们扩展到超出分辨率时,如果没有滚动条,就无法看到。因此,我已经将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向我展示了一个带有滚动窗格的JFrame,其中包含我的jcomponents。我已将滚动条设置为始终显示如上所示,但它们不可滚动,呈灰色显示。

正如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添加了line组件,但它不能滚动。

共有2个答案

郎宏浚
2023-03-14

我已经找到了解决我问题的临时办法。考虑到绘图有多简单,我决定使用线条的endpoint来覆盖preferredSize。

关于我上面发布的SSCCE,我在绘制组件()中添加了一个setPreferredSize(new Dimension(长度,长度)),以便在调用时preferredSize将始终是该行的终端。这确保我已经覆盖了整个绘画区域,并且如果需要,还可以滚动。

公良信然
2023-03-14

我很抱歉。您使用JScrollPane的方式是正确的。我运行了您的代码,我想我明白了JScrollPane无法工作的原因。想象一下,当您将jframe的背景设置为全红色时(通过在所有地方画一个小红点),jscrollpane应该是可滚动的吗?不,因为绘制背景颜色是在背景中。实际的VIEW不会改变,并且它不会比显示大小大,所以滚动窗格看不到滚动的意义。您的油漆组件方法正在做类似的事情。它只是在背景中绘制一些东西。实际的VIEW没有改变,所以滚动窗格不起作用。

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仍然是一样的

 类似资料:
  • 问题内容: 我需要在JScrollPane中内容的 左侧 放置一个滚动条。是否可以在没有单独的JScrollBar组件的情况下完成?也许只是通过设置一些对齐方式? 问题答案: 通过反复试验,我发现 像魅力一样运作。

  • 问题内容: 我有这个(包裹在)中,并有个。的内容是简单的HTML,其中包含使用img标签嵌入的某些图片(本地文件)。问题是,当您加载时,需要花一秒钟的时间来加载,然后在页面底部显示滚动条。如果我做: 它会暂时设置滚动条,然后出现另一个主题(大概负责加载图像)并将滚动条打回到底部。我尝试添加: 但这并没有解决。有没有办法从任一得到一个事件或当窗格完成加载,这样我可以设置滚动条,然后会通知我吗?另一种

  • 我有一个垂直滚动的JPanel,在该JPanel上有几个JScrollPane,当用户向下滚动面板时,如果用户的鼠标越过JScrollPane,他们就不能再滚动JPanel,他们必须将鼠标从JScrollPane移回面板上。过一段时间就会变得很烦人。

  • 更新3: 无法使用JScrollPane找到合适的解决方案,并编写了自定义滚动窗格。

  • 问题内容: 我希望能够滚动浏览整个页面,但不显示滚动条。 在谷歌浏览器中: 但是Mozilla Firefox和Internet Explorer似乎无法正常工作。 我也在CSS中尝试过: 那确实隐藏了滚动条,但我不能再滚动了。 有什么办法可以删除滚动条,同时仍然可以滚动整个页面? 请仅使用CSS或HTML。 问题答案: 只是测试工作正常。 JavaScript: 由于滚动条的宽度在不同的浏览器中

  • 问题内容: 我有下一个代码: 自动向下滚动。但是,如果我尝试向上滚动以重新阅读消息,则会强制向下滚动。我怎样才能解决这个问题? 问题答案: 添加新邮件时,使用尺寸与邮件窗格的首选大小相同的进行调用。给定垂直取向,它可方便地使的优选尺寸的邮件面板的高度的整数倍。另请参阅: 如何使用滚动窗格 。 附录:有关 文本区域滚动的 引人入胜的讨论也可能会有所帮助。