避免在SWT中的widget构造函数中设置父级?

时间:2014-02-20 07:09:58

标签: 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);

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

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

// 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();
}    

这是潜在错误的来源。

有没有办法避免这个问题?

1 个答案:

答案 0 :(得分:1)

SWT小部件依赖于运行应用程序的系统的本机小部件,并且与它们紧密相关。请查看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,使用构建器设计模式等。

希望这有帮助!