Java JScrollBar为图形调整大小

Java JScrollBar为图形调整大小,java,swing,scrollbar,Java,Swing,Scrollbar,我想画一幅有很多元素的画,但它们都不适合屏幕的高度。所以我决定使用滚动条来绘制元素,用户只需向下滚动即可。但是,即使元素保持绘制,滚动条也不会滚动。我尝试设置首选大小,但滚动条从未根据绘图数量重新调整。是否仍然可以动态调整滚动条的大小: public void paintComponent(Graphics g) { super.paintComponent(g); drawBus(3, g); drawDff(g, 4); for(int a = 0; a&

我想画一幅有很多元素的画,但它们都不适合屏幕的高度。所以我决定使用滚动条来绘制元素,用户只需向下滚动即可。但是,即使元素保持绘制,滚动条也不会滚动。我尝试设置首选大小,但滚动条从未根据绘图数量重新调整。是否仍然可以动态调整滚动条的大小:

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    drawBus(3, g);
    drawDff(g, 4);
    for(int a = 0; a<35; a++){
    drawAndGate("!AB!CD", g, a);
    this.setPreferredSize(screenSize);
    }
}


 public void drawAndGate(String input , Graphics orGfx, int numFF){
            orGfx.setColor(Color.black);
            orGfx.drawLine(400, 50 + (numFF*40), 400, 80 + (numFF*40));
            orGfx.drawLine(400, 50 + (numFF*40),420, 50 + (numFF*40));
            orGfx.drawLine(400, 80 + (numFF*40),420, 80 + (numFF*40));
            orGfx.drawArc(400, 50 + (numFF*40), 40,30, 270,180);
            orGfx.drawLine(400, 50 + (numFF*40) + 20, 0, 50 + ((numFF*40) +    20));
            orGfx.drawString(input, 400 - (input.length()*10), 50 + (numFF*40)+15);
            for(int a = 0; a < input.length(); a++){
                if(input.charAt(a) == '!'){                    
                    orGfx.fillOval((40 * 2*((int)input.charAt(a+1) - 64) - 5),50 + (numFF*40) + 15,10,10);
                    System.out.println((int)input.charAt(a+1) - 64);
                    a = a + 1;
                }
                else{
                orGfx.fillOval(40 + (40 *((int)input.charAt(a) - 64) - 5),50 + (numFF*40) + 15,10,10);
                }

            }
}

public static void main(String[] args) {
    draw3 d = new draw3(Color.white);
    d.setPreferredSize(new Dimension(800,800));
    JScrollPane  sg = new JScrollPane(d,VERTICAL_SCROLLBAR_ALWAYS,HORIZONTAL_SCROLLBAR_ALWAYS);

    JFrame j = new JFrame();
    j.setBackground(Color.white);
    j.setSize(400, 400);
    j.setExtendedState(JFrame.MAXIMIZED_BOTH);
    j.add(sg);
    j.setTitle("Circuit");
    j.pack();
    j.setVisible(true);
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
公共组件(图形g){
超级组件(g);
牵引车(3,g);
drawDff(g,4);

对于(int a=0;aSwing有时并不真正接受元素的大小。这是因为大多数布局管理器只是忽略了它们。我建议尝试在视口中使用其他布局管理器,但我不确定。您没有明确说明元素的绘制位置,但我假设它在
d
中。请确保它是扩展的ds
JPanel
并设置
sg
的首选大小,而不是
d
,因为它会限制元素的空间,并且不会滚动

此外,仅当图形作为
组件占用空间时,它才会滚动,因此将每个图形放在
JLabel
JPanel
中会更好


注:如果要动态添加图形,应使用
SwingUtilities
中的
invokeLater()
,以确保与Swing的线程同步。否则,需要调用
revalidate()
每次您绘制图形时。

我尝试设置sg的首选大小,但它没有滚动,只有在我设置面板大小时它才会滚动?您能解释一下让我的图形作为一个组件占用空间是什么意思吗?只要您有
布局,面板将占用其内容所需的空间Manager
(我从来没有尝试过在没有Manager的情况下使用
JScrollPane
),因此您不需要设置它的大小,并且可以通过“作为
组件占用空间”
“显示的区域将是
sg
首选大小我的意思是,您应该将每个图形放置在
JPanel
JLabel
中,因为它们占用空间,然后
sg
将知道
d
大于显示区域,从而可以进行滚动。