java - 如何使用 SWT 更改组件的父级?

标签 java swt

我的窗口应该允许两种不同类型的布局(这是一个更好地说明它的简单示例),例如

+-------------+-------------+-------------+
| Component 1 | Component 2 | Component 3 |
|             |             |             |
|             |             |             |
|             |             |             |
|             |             |             |
+-------------+-------------+-------------+

+-------------+---------------------------+
| Component 1 | Component 2               |
|             |                           |
|             +---------------------------+
|             | Component 3               |
|             |                           |
+-------------+---------------------------+

用户可以在两者之间切换的地方,例如,使用菜单项。

使用 SWT,您需要在创建组件时提供父组件。但是我们需要 (1) 重用组件和 (2) 将它们放在不同的父级中(类似于对接框架)。使用 SWT 这怎么可能?

最佳答案

您可以通过更改组件的父级来简单地做到这一点。

setParent() 更改控件的父级,如果底层操作系统支持。然后您可以 layout() 复合,这样更改就会出现。

假设您有三个控件:

  • 包含垂直控件的复合 c1
  • 包含水平控件的复合c2
  • 标签lbl
  • 一个按钮btn

代码如下:

public class ControlSwitcher {
    public static void main(String[] args) {
        Display display = new Display();
        final Shell shell = new Shell(display);
        GridLayout gl = new GridLayout();
        gl.marginWidth = gl.marginHeight = 20;
        shell.setLayout(gl);

        final Composite c1 = new Composite(shell, SWT.NONE);
        c1.setBackground(new Color(display, 255, 160, 160));
        RowLayout layout = new RowLayout(SWT.VERTICAL);
        c1.setLayout(layout);

        final Composite c2 = new Composite(c1, SWT.NONE);
        c2.setBackground(new Color(display, 160, 255, 160));
        c2.setLayout(new RowLayout());

        final Label lbl = new Label(c2, SWT.NORMAL);
        lbl.setText("Hello world");

        final Button btn = new Button(c2, SWT.PUSH);
        btn.setText("Switch");
        btn.addSelectionListener(new SelectionListener() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                Composite target;
                if (btn.getParent().equals(c2)) {
                    target = c1;
                } else {
                    target = c2;
                }
                boolean success = btn.setParent(target);
                if (success) {
                    target.pack();
                    shell.pack();
                } else {
                    throw new RuntimeException("Not supported by this platform");
                }
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }
        });

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

关于java - 如何使用 SWT 更改组件的父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4292345/

相关文章:

java - Google Firebase 服务器持久连接 invalid_token

java - 用于密码匹配的正则表达式

java - 为什么我的日期无法解析

java - 什么是 NullPointerException,我该如何解决?

java - SWT 中表格的简单示例

SWT 浏览器 XULRUNNER 10 : how to enable javascript to access to system clipboard

java - Karaf 中未列出的服务,可能是什么原因?

java - 没有 SWT.TITLE 的 SWT.CLOSE、SWT.MAX、SWT.MIN?

java - 热情 : export diagram to an image/pdf

java - 如何根据 child 的高度自动设置对话框高度?