ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

为什么Java SWT Selection侦听器中新创建的元素不会显示/触发绘制事件?

2019-07-09 04:00:14  阅读:235  来源: 互联网

标签:java user-interface events swt paint


我遇到了SWT(标准小部件工具包)和重绘问题.基本上我想要点击一个按钮时会发生一些事情,例如要出现的新元素.为了简单起见,请将其作为文字.

但是,当我单击按钮时没有任何反应,没有元素出现,没有触发PaintEvent.当我调整窗口大小时,突然所有元素都存在(因为它会触发paintEvent /重绘).

文档和博客文章告诉我,只要需要重新绘制某些内容,就会触发绘制事件.我认为向应用程序添加新元素将属于该类别.

所以问题是:我在这里做错了吗?我应该手动调用layout()/ redraw()来触发重绘吗?这对我来说似乎很乏味,而且我的理解是SWT在大多数情况下为我处理这个问题.

哦,我正在使用SWT 4.2.2运行Linux x64.但是我们在几乎任何平台上都有这个(以及旧的SWT 3.7).

这里是我的小示例代码:

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;

public class MainExample {

    public static void createText(Shell shell) {
      Text text = new Text(shell, SWT.SINGLE);
      text.setText("here is some fancy text");
    }

    public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell (display);
        Button button = new Button(shell, SWT.PUSH);
        button.setText("I am a button");

        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                System.out.println("Button Clicked");
                // Why do these texts not show up and not trigger a Paint Event?
                createText(e.display.getActiveShell());
            }
        });

        createText(shell);
        shell.setLayout (new RowLayout());
        shell.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                // just triggered in the beginning and with resizes
                System.out.println("Hooray we got a Paint event");
            }
        });
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) display.sleep();
        }
        display.dispose();
    }

}

请记住,这并非纯粹是为了让这个例子正常工作.对于更大的项目,这是一个简单版本的问题:-)

任何帮助都非常感谢!

解决方法:

如果使用布局,则应在将新子项添加到复合后调用Composite.layout()(或layout(true)).
在调用layout()之前,布局不知道(因此不要放置小部件).

顺便说一下,如果你调整shell(复合)的大小,布局会自动使其内部缓存无效并检查所有子节点,放置它们.这就是为什么在调整shell大小后会出现新创建的文本的原因.

标签:java,user-interface,events,swt,paint
来源: https://codeday.me/bug/20190709/1409136.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有