正如标题所示,我想为我的rcp用户界面添加一个监听器,以便检测最大化和最小化。实际上,这不是我的真正目的,但我认为这是一种解决我问题的方法。我在中心有一些形状的视图,即使窗口调整大小,我也希望将绘图精确地保留在中心。为此,我使用了以下监听器:
public void createPartControl(final Composite parent) {
display = parent.getDisplay();
white= display.getSystemColor(SWT.COLOR_WHITE);
parent.setLayout(new FillLayout(SWT.VERTICAL));
final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.setMinHeight(100);
sc.setMinWidth(100);
sc.setSize(565, 305);
final Composite child = new Composite(sc,SWT.NONE);
child.setLayout(new FillLayout());
// Set child as the scrolled content of the ScrolledComposite
sc.setContent(child);
child.setBackground(white);
gc = new GC(child);
parent.addListener (SWT.Resize, new Listener () {
public void handleEvent (Event e) {
x = child.getBounds().width/2;
y = child.getBounds().height/2;
child.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent event) {
dessin(gc); // draw my shapes
}
});
}
一切顺利,除非我最大化窗口然后最小化它,在这种情况下我松开了绘图(它在角落里)。 有什么好主意吗?我是以正确的方式思考的?
答案 0 :(得分:1)
检测最小化和非最小化(不一定是最大化)的两个事件是Iconify
和Deiconify
,它们只出现在Shell上。请参阅Shell的javadoc。
答案 1 :(得分:0)
考虑移动resize事件是为父母看到的,因为孩子不一定需要调整大小。
答案 2 :(得分:0)
为了将某些内容放在其他内容的中心,您需要的是SWT.Resize
事件,因此这个问题是XY Problem的经典案例。 (除非在这种情况下OP似乎已经怀疑这可能是XY问题。)
然而,由于以下原因,许多人在合理地需要以编程方式检测窗口最小化/最大化/恢复事件时遇到此问题:
如果您希望能够在退出时保存应用程序窗口的边界,则不能只保存Shell.getBounds()返回的内容,因为您的应用程序可能会在最小化或最大化或全屏时终止,在这种情况下它的界限不应该坚持下去。应该坚持的是shell的最小化/正常/最大化/全屏状态(我称之为"姿势",)以及上次其姿势为#34;正常&#34时的shell界限;。所以,基本上,你需要跟踪姿势何时是正常的",为此你需要改变姿势""事件
问题在于当SWT发出" deiconified"事件,它还没有计算shell的范围,因此在这种情况下你获得的值是假的。
所以,这是解决方案:
您将需要一种重新计算姿势的方法,如下所示:
private void recalculatePosture()
{
Posture posture = swtShell.getFullScreen()? Posture.FULLSCREEN
: swtShell.getMinimized()? Posture.MINIMIZED
: swtShell.getMaximized()? Posture.MAXIMIZED
: Posture.NORMAL;
if( posture != previousPosture )
{
issue event...
previousPosture = posture;
}
}
为了生成"最大化","恢复(从最大化)"和"全屏"您可以使用Shell.addListener()
来监听SWT.Move
和SWT.Resize
事件的事件,并在事件发生时调用recalculatePosture()
。
为了生成"最小化"事件,您可以使用shellIconified()
的{{1}}方法作为@ the.duckman说,并再次调用ShellListener
。
为了生成"恢复(从最小化)"活动,您需要在recalculatePosture()
:
ShellListener
这将导致 在 之后短时间重新计算姿势