我正在尝试添加一个PaintListener来绘制Composite上的顶部边框:
pageComposite.addPaintListener(new PaintListener(){
@Override
public void paintControl(PaintEvent e) {
e.gc.setForeground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
e.gc.drawLine(0, 0, pageComposite.getBounds().width, 0);
}
});
但如果使用 FillLayout 设置 pageComposite ,则不会绘制边框。
Composite c = new Composite(parent, SWT.NONE);
c.setLayout(new FillLayout());
new Label(c, SWT.NONE).setText("类方法列表页面,尚未实现");
return c;
在上面的代码中创建的复合看起来像这样: 另一个复合材料有一个FormLayout:
final Composite c = new Composite(parent, SWT.NONE);
c.setLayout(new FormLayout());
Label l = new Label(c, SWT.NONE);
l.setText("角色用户机构列表页面,尚未实现");
FormData fd_content = new FormData();
fd_content.top = new FormAttachment(0, 10);
fd_content.left = new FormAttachment(0, 10);
l.setLayoutData(fd_content);
return c;
我错过了什么吗? 最好的祝福!
答案 0 :(得分:2)
使用SWT org.eclipse.swt.layout.FillLayout
,您的paint event listener
未被调用,这就是您的边框未被绘制的原因。
原因是当你像这样使用FillLayout
时:
FillLayout fillLayout = new FillLayout();
composite.setLayout(fillLayout);
然后您没有设置任何其他装饰,例如indentation
,margin
等,因此您的窗口不会调用操作系统级别update
。
如果您想使其正常工作,请设置一些其他布局数据,例如marginHeight
。例如:
FillLayout fillLayout = new FillLayout();
fillLayout.marginHeight = 5;
composite.setLayout(fillLayout);
这是设置上述布局装饰后的样子(注意顶部边框):
<强> >>Code
强>
我已经添加了一些注释代码。尝试删除评论并查看其行为。
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class FillLayoutTest
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout()); shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Color c = new Color(display, new RGB(127, 127, 127));
final Composite composite = new Composite(shell, SWT.NONE);
FillLayout fillLayout = new FillLayout();
fillLayout.marginHeight = 5;
composite.setLayout(fillLayout);
//composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
new Label(composite, SWT.BORDER).setText("Hello World!!");
new Label(composite, SWT.BORDER).setText("Hello World Version 2.0!!");
composite.addPaintListener(new PaintListener(){
public void paintControl(PaintEvent e) {
e.gc.setForeground(c);
e.gc.drawLine(0, 0, composite.getParent().getBounds().width, 0);
//throw new RuntimeException();
}
});
shell.open();
shell.pack();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
if(c != null && !c.isDisposed())
c.dispose();
if(display != null && !display.isDisposed())
display.dispose();
}
}