2017-06-28 35 views
1

因此,我正在將Swing組件嵌入到SWT中。JTree不會自動擴展,Swing嵌入到SWT中

這裏是我的問題的簡化版本,基本上我有兩個面板對象(panelA, panelB)與一些Swing組件嵌入在我的Shell中。我想補充的開/關選項的panelB,這樣做,我做了,除了我的JTree填寫整個外殼,而panelB關閉,但事與願違......

的唯一途徑我發現正在重新創建組件,但我覺得這不是做事情的好方法。 (用於將關閉我使用的組件setVisible()) 當panelB爲off時,使JTree組件填充空間的任何想法都會填滿空間嗎?

import javax.swing.*; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.awt.SWT_AWT; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 


public class testCW { 

public static void main(String[] args) { 

    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setText("Test"); 
    shell.setLayout(new FillLayout()); 


    Composite compositeA = new Composite(shell,SWT.EMBEDDED); 
    java.awt.Frame frameA = SWT_AWT.new_Frame(compositeA); 
    java.awt.Panel panelA = new java.awt.Panel(new java.awt.BorderLayout()); 
    frameA.add(panelA); 
    JScrollPane scrollPaneA = new JScrollPane(new JTree()); 
    panelA.add(scrollPaneA); 


    Composite compositeB = new Composite(shell,SWT.EMBEDDED); 
    java.awt.Frame frameB = SWT_AWT.new_Frame(compositeB); 
    java.awt.Panel panelB = new java.awt.Panel(new java.awt.BorderLayout()); 
    frameB.add(panelB); 
    JButton buttonB = new JButton("Button"); 
    panelB.add(buttonB); 



    shell.open(); 
    while (!shell.isDisposed()) { 
    if (!display.readAndDispatch()) 
    display.sleep(); 
    // test 1 : hide panelB or compositeB? -> run -> JTree extends well? 
    // test 2 : hide panelB or compositeB? -> print panelB(compositeB) 
    // -> run -> displays well ? 
    // panelB.setVisible(false); 
    // compositeB.dispose();  //TEST 
    } 
    display.dispose(); 

} 
} 

回答

1

您可以添加保存的compositeAcompositeB象下面這樣的父複合:

final Composite composite = new Composite(shell, SWT.NONE); 
composite.setLayout(new GridLayout(2,false)); 

那麼你的複合材料添加到母象:

Composite compositeA = new Composite(composite, SWT.EMBEDDED); 
GridData filldataA = new GridData(GridData.FILL_BOTH); 
compositeA.setLayoutData(filldataA); 

請注意,我爲compositeA添加了GridData以最初佔用整個空間。

將選擇監聽器添加到工具欄上的SWT.PUSH按鈕。 可以說 - 你的SWT.PUSH按鈕是swtButton。 然後選擇監聽器添加到它象下面這樣:

swtButton.addSelectionListener(new SelectionAdapter() 
{ 
    private boolean expandTree = true; 
    @Override 
    public void widgetSelected(SelectionEvent e) 
    { 
     Layout lo = composite.getLayout(); 
     GridLayout glo = (GridLayout)lo; 
     if (expandTree) 
     { 
      glo.makeColumnsEqualWidth = true; 
      expandTree = false; 
     } 
     else 
     { 
      glo.makeColumnsEqualWidth = false; 
      expandTree = true; 
     } 

     composite.layout(); 
    } 
}); 

基本上,你在你的動作監聽一個布爾 - expandTree - 該按鈕,點擊之間切換,這取決於真或假的 - 使製作之間的父複合開關列等於真或假。

IMO你不需要compositeB

+0

由於它很好地擴展,但我應該怎麼添加到** **隱藏按鈕? 在我正在處理的應用程序上,我將有一個外部按鈕,它將**開/關**'buttonB',以便JTree組件可以填充整個空間。 –

+0

如果您在buttonB上隱藏/設置可見(false),您如何再次打開它,然後按下隱形按鈕?你可以顯示你正在談論的代碼嗎? – SomeDude

+0

也許你可以有一個複選框,而不是一個按鈕。檢查之後,展開樹狀結構,退​​出時摺疊樹 – SomeDude