2014-02-20 82 views
1

雖然Swing體系結構假設小部件被「添加」到另一箇中,但SWT使用另一個範例:每個小部件都在構造函數中具有父集。避免在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

你的對比是有缺陷的。在鞦韆中,您將在舊的和框架之間引入一個新的面板,而在SWT中,您將在按鈕和複合材料之間引入一個新的組合。如果你想在按鈕和麪板之間添加面板,你將不得不改變比SWT代碼更多的線... – Baz

+0

是的,你是對的,這是我的錯。 – Dims

+0

順便說一句:SWT方法的一些優點:1.你不能忘記添加一個控件給父母。 2.您無法將錯誤的控件添加到多個父母。 – Baz

回答

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的代理,使用生成器設計模式等

希望這有助於!