渲染 JList 时更改光标

2024-01-12

我已经实现了我想要做的事情,但我忍不住认为有一种更有效的方法......请允许我来说明。

简而言之,我要问的问题是是否有一种方法可以确定组件何时完成其初始渲染。

我有一个 JList,它连接到 DefaultListModel 并由扩展了 Default ListCellRenderer 的自定义渲染器绘制。

JList 的目的是通过日志文件“分页”,每次加载新页面时填充 2500 个元素。在我的机器上,通常需要几秒钟才能完全呈现 JList,这并不是真正的问题,因为将光标更改为等待光标是可以接受的,因为它会给用户即时反馈。不幸的是,我无法找到一种优雅的方法来知道初始渲染何时完成。

下面是我的渲染器的代码,您会在其中看到我正在计算渲染器上的迭代次数。如果该值介于 0 和 N-20 之间,则光标将更改为等待光标。一旦到达 N-20,它就会恢复为默认光标。正如我之前提到的,这工作得很好,但该解决方案确实感觉像是一个黑客。我已经实现了 DefaultListModel 的 ListDataListener 和 JList 的 PropertyChangeListener,但都没有产生我正在寻找的功能。

/**
 * Renders the MessageHistory List based on the search text and processed events
 */
public class MessageListRenderer extends DefaultListCellRenderer
{
    private static final long serialVersionUID = 1L;

    String lineCountWidth = Integer.toString(Integer.toString(m_MaxLineCount).length());

    @Override
    public Component getListCellRendererComponent(JList l, Object value, int index, boolean isSelected, boolean haveFocus) 
    {
        JLabel retVal = (JLabel)super.getListCellRendererComponent(l, value, index, isSelected, haveFocus);
        retVal.setText(formatListBoxOutput((String)value, index));

        // initial rendering is beginning - change the cursor
        if ((renderCounter == 0) && !renderCursorIsWait)
        {
            m_This.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));   
            renderCursorIsWait = true;
        }

        // initial rendering is complete - change the cursor back
        if ((renderCounter > (l.getModel().getSize() - 20)) && renderCursorIsWait)
        {
            m_This.setCursor(Cursor.getDefaultCursor());
            renderCursorIsWait = false;
        }

        renderCounter++;

        return retVal;
    }

    /**
     * Adds font tags (marks as red) around all values which match the search criteria
     * 
     * @param lineValue string to search in 
     * @param lineIndex line number being processed
     * @return string containing the markup
     */
    private String formatListBoxOutput(String lineValue, int lineIndex)
    {
        // Theoretically the count should never be zero or less, but this will avoid an exception just in case
        if (m_MaxLineCount <= 0)
            return lineValue;

        String formattedLineNumber = String.format("%" + Integer.toString(Integer.toString(m_MaxLineCount).length()) + "s", m_CurrentPage.getStartLineNumber() + lineIndex) + ": ";

        // We're not searching, simply return the line plus the added line number
        if((m_lastSearchText == null) || m_lastSearchText.isEmpty())
            return "<html><font color=\"#4682B4\">" + formattedLineNumber.replaceAll(" ", "&nbsp;") + "</font>" + lineValue + "</html>";

        // break up the search string by the search value in case there are multiple entries 
        String outText = "";    
        String[] listValues = lineValue.split(m_lastSearchText);

        if(listValues.length > 1)
        {
            // HTML gets rid of the preceding whitespace, so change it to the HTML code
            outText = "<html><font color=\"#4682B4\">" + formattedLineNumber.replaceAll(" ", "&nbsp;") + "</font>";

            for(int i = 0; i < listValues.length; i++)
            {
                outText += listValues[i];
                if(i + 1 < listValues.length)
                    outText += "<font color=\"red\">" + m_lastSearchText + "</font>";
            }

            return outText + "</html>";
        }

        return "<html><font color=\"#4682B4\">" + formattedLineNumber.replaceAll(" ", "&nbsp;") + "</font>" + lineValue + "</html>";
    }
}

我所做的就是填充模型:

// reset the rendering counter
this.renderCounter = 0;

// Reset the message history and add all new values
this.modelLogFileData.clear();
for (int i = 0; i < this.m_CurrentPage.getLines().size(); i++)
    this.modelLogFileData.addElement(this.m_CurrentPage.getLines().elementAt(i));

除了 @mKorbel 建议之外,还可以使用SwingWorker http://download.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#getState%28%29批量填充列表模型。向工作线程添加属性更改侦听器,并在完成后恢复光标。有相关问答here https://stackoverflow.com/questions/7053865/cant-get-arrayindexoutofboundsexception-from-future-and-swingworker-if-thread.

private static class TaskListener implements PropertyChangeListener {

    @Override
    public void propertyChange(PropertyChangeEvent e) {
        if (e.getNewValue() == SwingWorker.StateValue.DONE) {
            // restore cursor
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

渲染 JList 时更改光标 的相关文章

  • HibernateTemplate 可以与 EntityManager 共存吗?

    我们有一个 spring 3 应用程序 它仍然使用已弃用的HibernateTemplate为了持久性并希望迁移到更现代的 JPAEntityManager 是否可以在迁移过程中并行使用这两个 API 甚至可能在单个事务中同时使用 以便我们
  • 无法执行目标 org.codehaus.mojo:exec-maven-plugin:1.5.0:exec

    三周前 我完成了一个网络应用程序的工作 一切都运行没有问题 现在 三周后 没有任何更改 我想再次运行该应用程序 但这次我收到以下错误消息 An error occurred while parsing the server response
  • 为 JSP 创建注销链接?

    当用户登录我的应用程序时 他提交一个要通过 Servlet 处理的表单 servlet 为用户创建一个会话 我如何创建一个链接以便用户可以注销 我似乎无法直接链接到 Servlet 如何删除会话并链接回主页 HttpSession sess
  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • 从 Windows Batch (cmd.exe) 中的文件读取环境变量

    我正在尝试从批处理文件中读取变量 以便稍后在批处理脚本 Java 启动器 中使用 理想情况下 我希望所有平台 Unix Windows 上的设置文件都具有相同的格式 并且也是有效的 Java 属性文件 也就是说 它应该看起来像这样 sett
  • Spring MVC 和 Struts MVC 之间的区别 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Spring MVC 和 Struts MVC 之间的主要区别是什么 Spring MVC 和 Struts 之间的主要区别是 Spr
  • 当Java中set已经是原子的时候,为什么我们还需要compareAndSet呢?

    因为原子意味着线程安全 当 set 本身在java中是原子和线程安全的时候 我们什么时候使用compareAndSet 举例来说 我想以原子方式设置一个变量 以便每个其他线程都可以看到它 但我希望以线程安全的方式设置该变量 我可以简单地将其
  • Runtime.getRuntime().exec(cmd) 挂起

    我正在执行一个命令 该命令返回文件的修订号 文件名 但如果执行命令时出现问题 应用程序就会挂起 我可以做什么来避免这种情况 请在下面找到我的代码 String cmd cmd C si viewhistory fields revision
  • 控制启动时的竞争条件

    我有一些代码想要执行一些一次性初始化 但这段代码没有明确的生命周期 因此在初始化完成之前 我的逻辑可能会被多个线程调用 所以 我想基本上确保我的逻辑代码 等待 直到初始化完成 这是我的第一次剪辑 public class MyClass p
  • 如何在 WebSphere Liberty Batch 中配置事务超时?

    的作用是什么javax transaction global timeout 我是否需要实施检查点 超时 中的方法检查点算法 服务器配置级别有什么东西吗 它如何与应用程序级别的设置进行交互 2016年12月2日编辑 重新设计并解释了为应用程
  • 在字节数组上进行右位旋转/循环移位的最快方法是什么

    如果我有数组 01101111 11110000 00001111 111 240 15 移位 1 位的结果是 10110111 11111000 00000111 183 248 7 数组大小不固定 移位范围为 1 到 7 含 目前我有以
  • Apache Camel - 路由中的事务

    我有一个关于 Apache Camel 的一般性问题 我无法找到聚合器是否已进行交易 如果是交易 交易是如何实现的 聚合的速度有多快 将消息发送到聚合器可以在事务中运行 您需要一个带有聚合器的持久存储来让传出消息充当事务 请参阅有关持久性的
  • 错误:类 kotlin.reflect.jvm.internal.FunctionCaller$FieldSetter

    我已尝试一切方法来消除此错误 但它不断出现 Class kotlin reflect jvm internal FunctionCaller FieldSetter can not access a member of class com
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 如何在 Android 应用程序退出之前进行一些清理?

    当我的 Android 应用程序终止时 是否有某种 onTerminate 方法可以进行一些清理 我想清除一些 SharedPreferences 我有一个活动 它保持几个数字的运行平均值 并将其存储在 SharedPreference 中
  • 如何将 printStackTrace() 中的异常写入 Java 中的文本文件?

    我需要用 Java 捕获文本文件中的异常 例如 try File f new File catch FileNotFoundException f f printStackTrace instead of printing into con
  • 在android中测量不规则多边形的面积

    我正在开发一个应用程序 在其中我在地图上绘制多边形 并且我使用的地图不是谷歌 它的Mapsforge开源离线地图库 我可以通过将地理点转换为像素点来轻松在地图上绘制多边形 但在这里我想发现是不规则的多边形 为此我做了很多尝试 但它让我失败了
  • 项目级别的@PowerMockIgnore

    在 Maven 中运行时 我的 powermock 测试用例出现以下错误 java lang LinkageError loader constraint violation loader instance of org powermock
  • Java编程编译jar

    我有一个文本文件中的java源代码 必须在源代码中输入一些自定义的硬编码变量 然后将其转换为 jar 这是可行的 但是当我运行 jar 时 找不到 Main 类 当我用 WinRAR 解压 jar 文件时 我似乎找不到错误 当我通过 cmd

随机推荐

  • Rails 中的 j 函数有什么作用?

    我刚刚发现一个博客提到jRails 中的函数 他们用它来进行 ajax 样式的页面更新 cart html 我知道他们正在使用部分来渲染cart部分 但有什么意义j 我发现一些文章说它将字符串转换为 JavaScript 可以接受的内容 但
  • 滚动视图中的线性布局不占据整个高度

    我有一个线性布局说V1 在L1内部我有一个滚动视图V2 在滚动视图内部我有另一个线性布局V3 现在V3有一个gridtview V4 PBM 是 如果我的列表视图有 6 个项目 则只有 2 个项目可见 对于其余的 即使我看到有足够的空白空间
  • 如何以非阻塞的方式组合可观察量?

    我有一个 Observables 集合 每个 Observables 检索不同的数据类型 我将这些 Observable 链接起来以获取页面所需的所有数据 事实上 所有这些信息都是独立的 因此加载一个信息不应阻止或干扰加载其他信息 这是我无
  • 查找两个网页之间的最短路径

    我需要找到两个维基百科页面之间的最短距离 以 跃点 为单位 我有一种方法可以提取页面上的所有内部 wiki 链接 我知道起始目的地和结束目的地 但我对如何从数据中提取跃点一无所知 到目前为止 我一直在使用链接提取方法来填充字典 其中键是页面
  • 最简单、简约、opengl 3.2 cocoa项目

    我已经使用旧版 openGL 和 cocoa 多年了 但现在我正在努力过渡到 openGL 3 2 互联网上有几个例子 但它们都太复杂了 许多甚至在 XCode 5 1 下不再编译 有人可以编写一个最简单 简约 最小的可可代码示例 只是为了
  • 如何使用 rjags / JAGS 的估计值来预测值

    设置模型并使用吉布斯采样对其进行训练后 我得到了所有隐藏值预测的结果 jags lt jags model example bug data data n chains 4 n adapt 100 update jags 1000 samp
  • 之间的用法差异。 a.out、.ELF、.EXE 和 .COFF

    请不要看问题标题误会我的意思 我知道它们是什么 可移植可执行文件的格式 但我的兴趣范围略有不同 我的困惑 我参与了最初来自第三方的重新托管 重定向应用程序 问题是 有时目标代码的格式也是 elf COFF 格式 但仍然显示 可执行且可链接
  • Ajax CORS 替代方案

    我在 api example com 域上有一个 REST API 服务 并希望将此 api 也用于我在 www example com 上的 javascript ajax 请求 我使用 CORS 构建 jQuery AJAX 请求 GE
  • 验证 macOS 应用程序以将 Mac 从睡眠状态唤醒

    我正在寻找一种对 macOS 应用程序进行身份验证的方法 该方法允许该应用程序将用户的 Mac 从睡眠状态唤醒 我知道我可以安排一个电源事件来使用与所提供的类似的代码唤醒计算机here https stackoverflow com que
  • 文件描述符存储在进程内存中的哪里?

    当从执行点调用函数A时 内部是一个JMP语句到指向函数A的地址 因此当前执行点被保存到堆栈中 PC加载被调用函数A的地址并继续 为了在函数调用后返回到执行点 函数块应该有相同的压入和弹出堆栈 通常在 C 中退出函数时 定义的堆栈变量会被销毁
  • 如何防止 Vim 在分割窗口时滚动?

    当我水平分割窗口时 我想阻止 Vim 滚动 如果这是正确的词 假设我在 Vim 中编辑一个 10 行文件 我在缓冲区上有一个窗口 窗口高 40 行 有足够的空间容纳两个窗口 一个在另一个之上 两个窗口都显示整个缓冲区 比方说scrollof
  • $parse、$interpolate 和 $compile 服务之间有什么区别?

    有什么区别 parse interpolate and compile服务 对我来说 他们都做同样的事情 获取模板并将其编译为模板函数 这些都是有助于 AngularJS 视图渲染的服务示例 尽管 parse and interpolate
  • Java 计算一年中的天数或两个日期之间的天数

    任何本机 Java 类中是否有一种方法可以计算特定年份中过去 将有多少天 就像 这是一个闰年 https en wikipedia org wiki Leap year 366天 还是平年 365天 还是需要我自己写 我正在计算两个日期之间
  • git - 只获取文件,不获取历史记录

    当我跑步时git pull or git fetch 我显然检索了历史记录和文件 对于大型项目来说 这需要花费很多时间 我想知道如何加快这个过程 对于某些项目 我只对源代码感兴趣 而不是对历史感兴趣 有没有办法告诉 git 我只想获取文件的
  • 在寄存器前加一个星号是什么意思?

    我正在研究c 如何通过汇编语言调用正确的成员函数 我附带的简单程序如下 class A public virtual void show class B public A public void show
  • 如何从外部进程打开 Visual Studio 中的现有工作项?

    我有一个控制台应用程序 它使用 TFS API 创建工作项 我希望应用程序在打开创建的工作项的情况下启动 Visual Studio 我试过 Process Start vstfs WorkItemTracking WorkItem 123
  • resignFirstResponder 不起作用?

    我尝试在 iPad 上隐藏键盘 但我不知道为什么 resignFirstResponder 不起作用 但 popToRoot 工作得很好 BOOL textFieldShouldReturn UITextField textField NS
  • 如何在grep结果中保留换行符?

    我想将 grep 结果分配给一个变量以供进一步使用 lines cat abc txt grep hello 但当我这样做时 似乎换行符在结果中被删除 echo lines 只打印一行 如何保留换行符 因此当我回显 lines 时 它会生成
  • Python 初学者 - 没有名为“mpi4py”的模块

    我是一名学生 第一次使用Python 目前我在虚拟机上使用 Xubuntu 19 10 我检查了 python 和 mpi4py 安装 我的 并行编程 教授给了我这个简单的 python 代码 from mpi4py import MPI
  • 渲染 JList 时更改光标

    我已经实现了我想要做的事情 但我忍不住认为有一种更有效的方法 请允许我来说明 简而言之 我要问的问题是是否有一种方法可以确定组件何时完成其初始渲染 我有一个 JList 它连接到 DefaultListModel 并由扩展了 Default