java - 避免在 SWT 中的小部件构造函数中设置父级?

标签 java swing swt

虽然 Swing 架构假设小部件被“添加”到另一个小部件中,但 SWT 使用另一种范例:每个小部件在创建时都在构造函数中设置了父级。

我认为前一种方法更好,因为我可以隔离创建每个控件的代码。

例如

// creating button 1
JButton button1 = new JButton("Button 1");

// creating button 2
JButton button2 = new JButton("Button 2");

// creating button 3
JButton button3 = new JButton("Button 3");

// creating panel
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(button1);
panel.add(button2);
panel.add(button3);

// creating frame
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);


frame.pack();
frame.setVisible(true);

我们可以在这里拥有三个小部件,每个小部件都是在它自己的代码块中创建的。

如果我想再添加一个框架级别,我只需添加新 block 和一个小修复

// creating button 1
JButton button1 = new JButton("Button 1");

// creating button 2
JButton button2 = new JButton("Button 2");

// creating button 3
JButton button3 = new JButton("Button 3");

// creating panel
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(button1);
panel.add(button2);
panel.add(button3);

// creating another panel
JPanel panel2 = new JPanel();
panel2.setLayout(new FlowLayout());
panel2.add(panel);

// creating frame
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.add(panel);
frame.add(panel2); // one fix


frame.pack();
frame.setVisible(true);

SWT 中并非如此。我必须进行许多修复才能将所有子创建代码重新分配给新的父级。

Display display = new Display();

Shell shell = new Shell(display);
shell.setLayout(new RowLayout(SWT.HORIZONTAL));


Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(new RowLayout(SWT.HORIZONTAL));

Composite composite2 = new Composite(composite, SWT.NONE);
composite2.setLayout(new RowLayout(SWT.HORIZONTAL));


//Button button1 = new Button(composite, SWT.PUSH);
Button button1 = new Button(composite2, SWT.PUSH); // fix 1
button1.setText("Button 1");

// Button button2 = new Button(composite, SWT.PUSH);
Button button2 = new Button(composite2, SWT.PUSH); // fix 2
button2.setText("Button 2");

//Button button3 = new Button(composite, SWT.PUSH);
Button button3 = new Button(composite2, SWT.PUSH); // fix 3
button3.setText("Button 3");


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

这是潜在错误的根源。

有什么办法可以避免这个问题吗?

最佳答案

SWT 小部件依赖于应用程序运行所在系统的 native 小部件,并与其紧密绑定(bind)。看here SWT 和 JFace 权威指南的摘录,其中有很好的解释。

我想到的这个“问题”的唯一解决方案是为 SWT 小部件创建您自己的代理。代理将具有小部件属性所需的 setter 和一些 create 方法,该方法将根据您设置给代理的属性以 SWT 方式构造小部件。

public class ButtonProxy
{
    private String text;
    private String tooltipText;

    // all the other parameters you would like to use

    public void setText(String text)
    {
        this.text = text;
    }

    public void setTooltipText(String tooltipText)
    {
        this.tooltipText = tooltipText;
    }

    // all the other setters

    public Button create(Composite parent, int flags)
    {
        Button btn = new Button(parent, flags);
        btn.setText(this.text);
        btn.setTooltipText(this.tooltipText);
        return btn;
    }
}

您还可以为代理创建一些Factory,使用构建器设计模式等。

希望这有帮助!

关于java - 避免在 SWT 中的小部件构造函数中设置父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21900696/

相关文章:

Java (SWT/JFace) - 处理 Runnable 中的所有异常

java - 字段 'Id_employeer' 没有默认值

java - 使用来自 sql 的数据将数据添加到组合框 - java

java - 从表格单元格按钮打开对话框

eclipse-plugin - TreeViewer 到 GridTreeViewer : bridge between existing ITreeContentProviders and "lazy" ObservableListTreeContentProvider

java - 为什么我的 JPanel 上没有绘制矩形?

java - 如何创建新的 UserPrincipal?

java - 如何在旧版 Android 上使用 ActionBar?

java - Dispatcher-servlet 无法映射到 websocket 请求

java - JLabel 在 ActionListener 中没有被正确识别