1

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

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

我发现的唯一方法是重新创建组件,但我觉得这不是做事的好方法。(为了推迟我正在使用的组件)当 panelB关闭setVisible()时,让 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();

}
}
4

2 回答 2

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);

请注意,我最初为复合 A 添加了 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根据真或假在按钮单击之间切换-使父复合在使列等宽真或假之间切换。

海事组织你不需要compositeB

于 2017-06-28T16:10:26.463 回答
0

你必须坚持使用 FillLayout 吗?每当您想在 SWT 中隐藏组件时,建议使用 GridLayout。这是一个如何做到这一点的例子:http ://www.java2s.com/Code/Java/SWT-JFace-Eclipse/ExcludeawidgetfromaGridLayout.htm

于 2017-06-28T15:48:17.073 回答