所以我正在使用嵌入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();
}
}
答案 0 :(得分:1)
您可以添加包含compositeA
,compositeB
的父组合,如下所示:
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