You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing公交服务可视化面板滚动功能实现求助

解决方案:实现带滚动条的公交服务计划可视化面板

你的问题核心在于JScrollPane无法识别到需要滚动的内容尺寸,原因是外层JPanel的布局和自定义Planzeichner面板的尺寸设置不正确。以下是具体修改步骤和代码:

1. 主类代码修改

默认的JPanel使用FlowLayout,不会让子组件(Planzeichner)撑满面板的首选大小,导致ScrollPane认为内容没有超出窗口范围。我们需要把外层JPanel的布局改为BorderLayout,确保子组件能填满整个面板:

JFrame f = new JFrame();
f.setSize(1000, 800);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 添加上关闭窗口退出程序的逻辑

// 修改外层JPanel的布局为BorderLayout
JPanel panel = new JPanel(new BorderLayout());
// 仅设置首选大小,ScrollPane会以此为依据计算滚动区域
panel.setPreferredSize(new Dimension(2900, 800));

Planzeichner dp = new Planzeichner(Umläufe); 
panel.add(dp, BorderLayout.CENTER); // 用BorderLayout.CENTER让子组件填满面板

JScrollPane scPa = new JScrollPane(panel, 
    ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
f.getContentPane().add(scPa);

f.setVisible(true);

2. Planzeichner类修改

自定义面板需要明确自己的首选大小,这样父容器才能知道它的实际尺寸,ScrollPane才能正确生成滚动条。同时调整绘制的垂直线高度,避免超出面板可视范围:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Vector;
import javax.swing.JPanel;

public class Planzeichner extends JPanel{
    
    private Vector Umläufe;
    
    public Planzeichner(Vector Umläufe) {
        super();
        this.Umläufe = Umläufe;
        // 设置自定义面板的首选大小,和绘制区域匹配
        this.setPreferredSize(new Dimension(2900, 800));
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        Graphics2D g2d = (Graphics2D) g;
        
        // 绘制坐标系
        g.setColor(Color.black);
        g.drawLine(10, 10, 2890, 10);
        g.setColor(Color.LIGHT_GRAY);
        
        // 调整垂直线的终点y坐标为面板高度减10,避免超出可视区域
        int panelHeight = this.getHeight();
        for(int i=0; i<24; i++) {
            int x = 10 + i*120;
            g.drawLine(x, 10, x, panelHeight - 10);
            String Stunde = String.valueOf(i+5);
            g.drawString(Stunde, x, 9);
        }
    }
}

关键修改说明

  • 布局改为BorderLayout:FlowLayout会根据子组件的最小尺寸排列,无法让子组件填满父面板;BorderLayout的CENTER区域会自动拉伸子组件,匹配父面板的大小。
  • 设置Planzeichner的首选大小:自定义面板必须告诉Swing它需要的空间大小,否则ScrollPane无法判断内容是否超出窗口,也就不会生成滚动条。
  • 调整绘制范围:避免绘制内容超出面板的可视区域,确保所有元素都在滚动范围内。

内容的提问来源于stack exchange,提问作者Tjum28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:30:07