虽然 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/