Java SWT JFace如何在下面移动后重新绘制()
我有一个视图,根据以前的选择显示元素。dispose()和parent.layout()确实按预期删除了元素。问题是,我怎样才能找回它们?我想,dispose()不会删除元素,只是将其从元素列表中取出进行渲染。那么,我怎样才能拿回一个呢 Thanx提前, 马库斯Java SWT JFace如何在下面移动后重新绘制(),java,swt,dispose,jface,Java,Swt,Dispose,Jface,我有一个视图,根据以前的选择显示元素。dispose()和parent.layout()确实按预期删除了元素。问题是,我怎样才能找回它们?我想,dispose()不会删除元素,只是将其从元素列表中取出进行渲染。那么,我怎样才能拿回一个呢 Thanx提前, 马库斯 编辑: 刚刚发现,dispose()释放对象并递归地释放它的子对象,所以我必须重新创建它们,一旦我处理了它们?如果是,我如何在网格布局中找到位置 编辑(2): 根据下面的答案,我尝试过: public class TestTab e
编辑: 刚刚发现,dispose()释放对象并递归地释放它的子对象,所以我必须重新创建它们,一旦我处理了它们?如果是,我如何在网格布局中找到位置
编辑(2): 根据下面的答案,我尝试过:
public class TestTab extends Composite
{
org.eclipse.swt.layout.GridLayout layout = null;
GridData griddata = null;
Button upperButton = null;
Text textInTheMiddle = null;
Button lowerButton = null;
public InvoiceTab(Composite parent, int arg2) {
super(parent, arg2);
final Composite myParent = parent;
layout = new org.eclipse.swt.layout.GridLayout(GridData.FILL_BOTH,
false);
layout.numColumns = 1;
this.setLayout(layout);
upperButton = new Button(this, SWT.PUSH);
upperButton.setText("upper Button");
textInTheMiddle = new Text(this, SWT.BORDER);
lowerButton = new Button(this, SWT.PUSH);
lowerButton.setText("lower Button");
upperButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (textInTheMiddle.isVisible()) {
textInTheMiddle.setVisible(false);
lowerButton.moveBelow(upperButton);
} else {
textInTheMiddle.setVisible(true);
lowerButton.moveBelow(textInTheMiddle);
}
myParent.layout();
}
});
}
}
textfield gest按预期可见,但下部按钮不改变位置?
Thanx对于任何想法…是的,dispose()释放对象并递归地释放其子对象。因此,您必须重新创建已处置的控件/小部件。在类似您的场景中,建议隐藏控件并重新布局组合/容器。例如
代码!!
重要的一点是GridData::exclude
属性的用法
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
class TestTab extends Composite
{
Button upperButton = null;
Text textInTheMiddle = null;
Button lowerButton = null;
boolean state = true;
public TestTab(Composite parent, int style)
{
super(parent, style);
GridLayout layout = new GridLayout(1, false);
setLayout(layout);
upperButton = new Button(this, SWT.PUSH);
upperButton.setText("upper Button");
textInTheMiddle = new Text(this, SWT.BORDER);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.exclude = false;
textInTheMiddle.setLayoutData(data);
lowerButton = new Button(this, SWT.PUSH);
lowerButton.setText("lower Button");
upperButton.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e) {
GridData griddata = (GridData) textInTheMiddle.getLayoutData();
griddata.exclude = state;
textInTheMiddle.setVisible(!state);
textInTheMiddle.getParent().layout(false);
state = !state;
}
});
}
}
public class Test
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, false));
new TestTab(shell, SWT.NONE);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
是的,dispose()释放对象并递归地释放其子对象。因此,您必须重新创建已处置的控件/小部件。在类似您的场景中,建议隐藏控件并重新布局组合/容器。例如
代码!!
重要的一点是GridData::exclude
属性的用法
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
class TestTab extends Composite
{
Button upperButton = null;
Text textInTheMiddle = null;
Button lowerButton = null;
boolean state = true;
public TestTab(Composite parent, int style)
{
super(parent, style);
GridLayout layout = new GridLayout(1, false);
setLayout(layout);
upperButton = new Button(this, SWT.PUSH);
upperButton.setText("upper Button");
textInTheMiddle = new Text(this, SWT.BORDER);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.exclude = false;
textInTheMiddle.setLayoutData(data);
lowerButton = new Button(this, SWT.PUSH);
lowerButton.setText("lower Button");
upperButton.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e) {
GridData griddata = (GridData) textInTheMiddle.getLayoutData();
griddata.exclude = state;
textInTheMiddle.setVisible(!state);
textInTheMiddle.getParent().layout(false);
state = !state;
}
});
}
}
public class Test
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, false));
new TestTab(shell, SWT.NONE);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
你的代码对我有用。顺便说一句:
GridLayout
的构造函数的第一个参数用于设置列数。您不应该使用GridData.Fill_两者
,而应该使用1
。@marcus toeper:查看我的更新答案。@marcus toeper:也可以使用myParent.layout()
,而不是使用textinhemiddle.getParent().layout()代码>当您使用this
作为textinhemiddle=新文本(这个,SWT.BORDER)代码>完成,谢谢你们两个8)你们的代码对我有用。顺便说一句:GridLayout
的构造函数的第一个参数用于设置列数。您不应该使用GridData.Fill_两者
,而应该使用1
。@marcus toeper:查看我的更新答案。@marcus toeper:也可以使用myParent.layout()
,而不是使用textinhemiddle.getParent().layout()代码>当您使用this
作为textinhemiddle=新文本(这个,SWT.BORDER)代码>完成,谢谢你们两位8)真的很有帮助。谢谢真的很有帮助。谢谢