JTree不会自动扩展,Swing嵌入到SWT中

时间:2017-06-28 14:06:29

标签: java swing swt swt-awt

所以我正在使用嵌入SWT的Swing组件。

这是我的问题的简化版本,基本上我有两个Panel对象(panelA, panelB)和一些嵌入我的Shell的Swing组件。我想在panelB上添加一个开/关选项,除了我的JTree之外我做的就是填充整个Shell而panelB 关闭,但它没有......

我找到的唯一方法是重新创建组件,但我觉得这不是做事的好方法。 (用于关闭我正在使用的组件setVisible())  当panelB 关闭时,有什么想法让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();

}
}

2 个答案:

答案 0 :(得分: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 - 在按钮点击之间切换,具体取决于true或false - 在使列等于width true或false之间进行父复合切换。

IMO您不需要compositeB

答案 1 :(得分:0)

你必须坚持使用FillLayout吗?每当您想在SWT中隐藏组件时,建议使用GridLayout。以下是如何执行此操作的示例:http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/ExcludeawidgetfromaGridLayout.htm