虽然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();
}
这是潜在错误的来源。
有没有办法避免这个问题?
答案 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
,使用构建器设计模式等。
希望这有帮助!