JScrollPane滚动条不可滚动

时间:2013-01-02 03:04:00

标签: java swing jframe jscrollpane jcomponent

我有一个类绘制一些非常简单的图形,如线条,圆形和矩形。线条是动态可扩展的,有时当它们超出分辨率时,如果没有滚动条,则无法看到。因此,我已将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的scrollpane的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,但它不能滚动。

2 个答案:

答案 0 :(得分:1)

道歉。您正在以正确的方式使用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仍然是相同的

答案 1 :(得分:0)

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

与我上面发布的SSCCE有关,我在paintComponent()中添加了一个 setPreferredSize(new Dimension(length,length),这样preferredSize将始终是该行的终点。如果需要的话,这可以确保我已经覆盖了整个绘画区域并且能够滚动。