当前位置: 首页 > 面试题库 >

在SWT / JFace RCP应用程序中填充大表

刘明朗
2023-03-14
问题内容

您将如何在SWT表中显示大量行?巨大的东西超过20K行20列。不要问我为什么我需要显示这么多数据,这不是重点。关键是如何使其尽可能快地工作,以使最终用户不会感到无聊的等待。每行显示一个对象的实例,列是其属性(某些)。我以为使用JFace内容/标签提供程序模式,但担心它比直接用数据命中表还要慢。它是这样的:

    Display.getDefault().asyncExec(new Runnable() {
       public void run() {
           List<MyObject> objects = model.getViewData();
           for(MyObject object: objects){
           TableItem item = new TableItem(table, SWT.NULL);
           item.setImage(0, img1);
           item.setBackground(color1);
               item.setText(0, object.getProperty0());
               item.setText(1, object.getProperty1());
               item.setText(2, object.getProperty2());
               ..... 
            }
       });

在我的计算机上绘制20k条记录大约需要20秒。我在Windows中看到的最大性能问题是由创建新表项并填充文本时SWT发送的大量本机窗口消息引起的。我发现了一个很好的解决方法-
在填充之前隐藏表,然后在完成时显示它。只是在循环之前调用table.setVisible(false)而在循环之后调用table.setVisible(true)确实令人惊奇-
速度提高了六十七倍!

我想进一步加快速度。你有什么建议?另外,我想知道隐藏小部件的技巧在SWT(又名Linux)的非Windows实现中如何工作?


问题答案:

SWT可以为您做到这一点。当您使用SWT.VIRTUAL样式标志时,仅当滚动到视图时才创建项目。方法如下:

  1. 创建样式为SWT.VIRTUAL的表
  2. 使用Table#setItemCount()设置行数
  3. 添加一个SWT.SetData侦听器,该侦听器可按需填充TableItems。

这是一个代码片段:

public static void main( String[] args ) {
    Display display = new Display();
    Shell shell = new Shell( display );
    shell.setLayout( new FillLayout() );
    final Table table = new Table( shell, SWT.VIRTUAL );
    table.setItemCount( 10000 );
    table.addListener( SWT.SetData, new Listener() {
        public void handleEvent( Event event ) {
            TableItem item = (TableItem)event.item;
            item.setText( "Item " + table.indexOf( item ) );
        }
    } );
    shell.setSize( 300, 500 );
    shell.open();
    while( !shell.isDisposed() ) {
        if( !display.readAndDispatch() ) {
            display.sleep();
        }
    }
    display.dispose();
}


 类似资料:
  • 我使用的是带有富面孔的JSF1.2,但现在的要求是将现有的页面(目前是表)更改为jquery支持的表(DataTables插件),因为富面孔存在性能问题,而且我们还希望这样做以获得额外的特性。 正确的方法应该是什么,当前尝试使用DataTables并对Servlet进行ajax调用,以便服务器端处理并返回JSON数据以填充表。 请建议实现这些目标的合适选项。 感谢大家。

  • 问题内容: 我想在运行时用许多行填充JTable(说10000)。但是我所有的尝试都非常糟糕且效率低下。 起点是获取代表一行的对象列表的方法。我试图通过SwingWorker填写表格,但这对我来说仅适用于小数据。 另一个尝试是直接设置数据而不使用任何类型的线程,但这也非常慢,至少UI不会像SwingWorker那样被阻塞。 那么,您如何做到这一点呢?该表应逐行或逐块填充,但不能全部由一个填充,同时

  • 问题内容: 我正在编写Web应用程序,并且想知道推荐的填充原始数据的方法是什么。这是JPA / Hibernate和Spring应用程序,由maven构建。到目前为止,我已经使用脚本将手工数据填充到数据库中,并填充了初始数据。 单元测试使用自己的数据,这些数据是在每次测试之前用代码创建的。我的测试类扩展了 org.springframework.test.jpa.AbstractJpaTests

  • 问题内容: 我编写了一个SWT UI,它的主要功能是在StyledText控件中显示文本。我想为+ 添加一个处理程序,以便在按下该快捷方式时将焦点设置为搜索框。我尝试使用以下代码检测按键。 我期待在按+ 时看到以下输出: 但是,实际上,我实际上看到了以下内容。 我有两个问题: Display.addFilter(…)是添加全局快捷方式的最佳方法吗?我尝试了Display.addListener(…

  • 我有一个Postgres服务器运行在Docker内部。在这个Postgres服务器中,我有一个名为'aa'的数据库。 我还有一个Spring Boot应用程序的Docker映像。当在Docker中执行此映像时,应该在数据库'aa'中创建数据库表。 为了实现这一点,我执行了以下步骤: 创建数据库AA; 我检查了日志:它说数据库'aa'不存在,很明显它存在于Postgres服务器中 psqlexcep