2

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

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

4

2 回答 2

1

我很抱歉。您正在以正确的方式使用 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 还是一样的

于 2013-01-02T05:07:24.223 回答
0

我找到了一个临时解决我的问题的方法。鉴于绘图非常简单,我决定使用线的终点来覆盖preferredSize。

关于我在上面发布的 SSCCE,我在 paintComponent() 中添加了一个setPreferredSize(new Dimension(length, length)以便在调用时,preferredSize 始终是该行的终点。这确保我得到了如果需要,可以覆盖整个绘画区域,但仍可以滚动。

于 2013-01-02T08:17:07.127 回答