如何使JScrollPane(在BorderLayout中,包含JPanel)平滑自动滚动

2023-11-21

我试图在 JScrollPanel 内有一个不同大小的 JPanel(可能比标准屏幕宽得多)。目前效果很好,我已经将滚动条配置为手动正常工作,但是我希望 JPanel 不断向左“滚动”,以便随着时间的推移显示整个内容。我找到的所有答案都特定于 JTextArea 并使用插入符,或使用 rectToVisible。这些都不起作用,因为我试图在内部滚动到单个 JPanel。

我已经包含了我认为是下面所有相关代码的内容。

中心是 JPanel(其中 Grid 是其子类,用于专门绘制带有一些特定颜色单元格的网格)以及我想要自动滚动的 BorderLayout。

public GuiViewFrame(Song playMe) {
  String[][] songArray = playMe.to2DArray();

  this.displayPanel = new ConcreteGuiViewPanel(playMe);
  main = new JPanel();
  main.setLayout(new BorderLayout());
  displayPanel.setLayout(new BorderLayout());
  center = new Grid(playMe);
  labels = new Labels(playMe);
  horiz = new Horiz(playMe);
  center.setPreferredSize(new Dimension(10 * songArray.length, 10 * songArray[0].length));
  horiz.setPreferredSize(new Dimension(10 * songArray.length, 10));
  horiz.setVisible(true);

  main.add(center, BorderLayout.CENTER);
  main.add(horiz, BorderLayout.NORTH);

  scroll = new JScrollPane(main,
        JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
  add(scroll, BorderLayout.CENTER);
  labels.setPreferredSize(new Dimension(20, 10 * songArray[0].length));
  labels.setVisible(true);
  add(labels, BorderLayout.WEST);

  JScrollBar horiz = scroll.getHorizontalScrollBar();
  InputMap im = horiz.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
  im.put(KeyStroke.getKeyStroke("RIGHT"), "positiveUnitIncrement");
  im.put(KeyStroke.getKeyStroke("LEFT"), "negativeUnitIncrement");
  im.put(KeyStroke.getKeyStroke("HOME"), "minScroll");
  im.put(KeyStroke.getKeyStroke("END"), "maxScroll");

  this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  this.pack();
}

整个项目是生成一个结合了 MIDI 和 GUI 的音乐播放视图,但现在一旦 MIDI 播放了足够多的歌曲,相关音符就会在屏幕外显示。我想以与 MIDI 同步的速度滚动。


您可以设置水平滚动条的值来控制当前可见的内容:

JScrollBar horizontal = scroll.getHorizontalScrollBar();
horizontal.setValue( horizontal.getValue() + ??? );

你需要使用一个摇摆计时器以适当的间隔安排滚动。

使用的简单示例Timer滚动文本:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class TimerTest extends JPanel implements ActionListener
{
    JLabel timeLabel;
    JLabel scrollLabel;

    public TimerTest()
    {
        setLayout( new BorderLayout() );

        timeLabel = new JLabel( new Date().toString() );
        add(timeLabel, BorderLayout.NORTH);

        scrollLabel = new JLabel( "Some continuously scrolling text!!      " );
        add(scrollLabel, BorderLayout.SOUTH);

        int time = 1000;
        javax.swing.Timer timer = new javax.swing.Timer(time, this);
        timer.setInitialDelay(1);
        timer.start();
    }

    public void actionPerformed(ActionEvent e)
    {
        timeLabel.setText( new Date().toString() );
        String oldText = scrollLabel.getText();

        // Scroll right to left
        String newText = oldText.substring(1) + oldText.substring(0, 1);

        // Scroll left to right
//      int length = oldText.length();
//      String newText = oldText.substring(length-1, length)
//          + oldText.substring(0, length-1);

        scrollLabel.setText( newText );
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TimerTest() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使JScrollPane(在BorderLayout中,包含JPanel)平滑自动滚动 的相关文章

随机推荐

  • Haskell:单子 takeWhile?

    我有一些用 C 编写的函数 我从 Haskell 调用它们 这些函数返回IO CInt 有时我想运行所有函数 无论它们返回什么 这很容易 为了示例代码 这是当前发生的情况的总体思路 Prelude gt let f x print x gt
  • Twitter Bootstrap 轮播显示两个项目

    现在我已经实施了Twitter Bootstrap 3 Carousel它显示一个项目并在转换期间显示下一个元素 因此它看起来像 1 transition 2 transition 3 我必须显示两个项目 并在转换后显示第二个元素和第三个元
  • 如何解析从字符串加载 XSL 的转换中包含的 XSL?

    NET 2 0 VS2005 我正在尝试使用XslCompiledTransform类来执行 XSL 转换 我有两个 XSL 文件 第一个文件包含对另一个文件的引用 其形式为
  • 对列表中的奇数进行排序

    如何对整数列表中的奇数进行升序排序 但将偶数保留在原来的位置 Example sortArray 5 3 2 8 1 4 1 3 2 8 5 4 我的代码 def sort array source array odd numbers n
  • 是否可以重置 iOS 中的隐私设置?

    为了测试对 iOS 日历的访问权限 我需要重置测试设备上的隐私设置 但是 每次我在设备上安装它时 它都会记住旧的隐私设置 并且不会显示警报视图来询问我是否授予访问权限 删除应用程序并重新安装并不会改变这一事实 有没有办法让 iOS 忘记它知
  • robots.txt 的正则表达式

    我正在尝试设置 robots txt 但我不确定正则表达式 我有四个不同的页面 全部以三种不同的语言提供 我想我可以使用正则表达式 而不是列出每个页面乘以 3 nav aspx page aspx changelang 可能附加一个查询字符
  • Android:检测 USB

    有什么方法可以 以编程方式 在您的活动 应用程序中知道用户已通过 USB 将您的手机连接到 PC 有些人建议使用UMS CONNECTED从最新版本的 Android 开始已弃用 另一个问题是它不适用于支持 MTP 的设备 其他人建议使用B
  • 错误消息“您无法登录此应用程序,因为它不符合 Google 的 OAuth 2.0 政策以确保应用程序安全”

    我正在开发一个基于网络的应用程序 它允许我信任的员工编辑我的 YouTube 频道的标题 描述 标签等 在尝试 选择加入 我自己的应用程序时 我被发送到回调 URI 并附带一条错误消息 您无法登录此应用 因为它不符合 Google 保护应用
  • C++ 中使用向下取整、向上取整和向外舍入模式进行整数除法

    最近 我看到这个问题它询问如何将整数除以ceil舍入 朝正无穷大 不幸的是 答案要么不适用于有符号整数 要么存在下溢和溢出问题 例如 接受的答案有这个解决方案 q 1 x 1 y When x为零 则存在下溢 0结果是不正确的 你如何实施c
  • Google 地理编码 v2 API 突然停止工作

    地理编码 v2 API 意外停止 e g 我无法从 API 获取经纬度 服务器的输出是 Status code 610 request geocode 我搜索了status 610但找不到任何相关信息 Thanks 服务已停止 今天是 3
  • IIS 中的匿名访问和 NTLM 身份验证

    我有一台使用 IIS 设置的服务器 并且我的站点有一些允许匿名访问的页面和一些需要 集成 Windows 身份验证 的页面 在 IIS 的 身份验证方法 屏幕上 您似乎可以同时启用 集成 Windows 身份验证 和匿名访问 但我读过的文档
  • Fieldset:中心图例

    正如之前多次询问的那样 但从未真正回答过 我想将图例放在字段集中 这个技巧在这里完美完成 我也为我的项目购买了它 http themeforest net item aloma liquid mobile template full scr
  • 使用 PostgreSQL 和 REF_CURSOR 的 JPA 2.1 StoredProcedureQuery

    我在 PostgreSQL 数据库中创建了一个函数 我想使用 JPA 2 1 的 StoredProcedureQuery 方法调用该函数 这是我的 PostgreSQL 查询 CREATE OR REPLACE FUNCTION get
  • 如何重命名路径以响应填充

    我有一个这样的查询 galleryModel find id galleryId populate model User path objectId select firstName lastName 结束响应objectId会是这样的 o
  • C++ 约束应该急切地评估还是惰性地评估?

    这个问题的主要目的是引起社区对 libstdc 范围不适用于 clang 的关注 https bugs llvm org show bug cgi id 46746 Avi Kivity 认为这是一个 gcc 错误 https gcc gn
  • 如何在 Scala 中定义保留前导标记的三元运算符?

    我正在编写一个生成 Scala 输出的代码生成器 我需要以这样的方式模拟三元运算符 即导致 的标记保持不变 例如转换表达式c p q to c something 简单的if c p else q不符合我的标准 因为它需要if before
  • jQuery.data 不再适用于窗口?

    我最近升级了我们项目的 jQuery 文件1 4 2 to 1 4 4看来截至1 4 3我们一直在使用的方式jQuery data已停止工作 我们有这样的代码 var events window data events if events
  • 命名空间/解决方案结构

    我很抱歉问了这样一个笼统的问题 但这对我来说可能是一个挑战 我的团队即将开始一个大型项目 该项目有望将多年来不断发展的所有随机一次性代码库整合在一起 鉴于该项目将涵盖整个公司的标准化逻辑实体 客户 员工 小任务 控制小任务的大任务以及公用事
  • AutoMapper 映射中的 foreach 中的额外迭代

    由于某种原因 我在 AutoMapper 地图定义中使用的循环迭代次数超出了应有的次数 地图定义 Mapper CreateMap
  • 如何使JScrollPane(在BorderLayout中,包含JPanel)平滑自动滚动

    我试图在 JScrollPanel 内有一个不同大小的 JPanel 可能比标准屏幕宽得多 目前效果很好 我已经将滚动条配置为手动正常工作 但是我希望 JPanel 不断向左 滚动 以便随着时间的推移显示整个内容 我找到的所有答案都特定于