学习《Eclipse从入门到精通》时,参考第11章第1节的代码。在同样Code的情况下,Design视图显示工具栏正常,但实际运行时无法显示。
※ 该问题,在《Eclipse从入门到精通》(第二版)已经解决,处理方式相同。
一、平台环境
IDE平台:
Eclipse Platform 3.6.0.I20100608-0911 org.eclipse.platform.ide
插件:
SWT Designer 0.9.0.r36x201102111222 org.eclipse.wb.rcp.feature.feature.group
二、错误现象
《Eclipse从入门到精通》第11章第1节,即105页的代码:
public class SimpleEditor {
private static Text text;
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
Display display = Display.getDefault();
Shell shell = new Shell();
shell.setSize(450, 439);
shell.setText(“SWT Application”);
shell.setLayout(new FillLayout());
ViewForm viewForm = new ViewForm(shell,SWT.None);
ToolBar toolBar = new ToolBar(viewForm, SWT.NONE);
text = new Text(viewForm, SWT.BORDER|SWT.V_SCROLL);
viewForm.setContent(text);
viewForm.setTopLeft(toolBar); //问题在这里
ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH);
toolItem.setText(“取得”);
ToolItem toolItem2 = new ToolItem(toolBar, SWT.PUSH);
toolItem2.setText(“清除”);
toolItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String str = text.getText();
MessageDialog.openInformation(null, “Text”, str);
}
});
toolItem2.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
text.setText(“”);
}
});
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
Design视图结果如下:
三、解决
从其他SWT的ToolBar示例,在没有设定ViewForm 容器的情况下,ToolBar是可以正常显示的。当我修改代码,把ToolBar直接建立在Shell 上,工具栏即可显示出来。因此,判断问题出在ViewForm 容器上。
经搜索,找到问题的解决办法,即先设置好ToolBar上所有的ToolItem,最后在定义ViewForm的setTopLeft方法,把ToolBar显示出来。
效果如下:
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public class SimpleEditor {
private static Text text;
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
Display display = Display.getDefault();
Shell shell = new Shell();
shell.setSize(450, 439);
shell.setText(“SWT Application”);
shell.setLayout(new FillLayout());
ViewForm viewForm = new ViewForm(shell,SWT.None);
ToolBar toolBar = new ToolBar(viewForm, SWT.NONE);
text = new Text(viewForm, SWT.BORDER|SWT.V_SCROLL);
viewForm.setContent(text);
//viewForm.setTopLeft(toolBar); //把这行挪到所有ToolItem定义后面
ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH);
toolItem.setText(“取得”);
ToolItem toolItem2 = new ToolItem(toolBar, SWT.PUSH);
toolItem2.setText(“清除”);
viewForm.setTopLeft(toolBar); //改动的地方
toolItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String str = text.getText();
MessageDialog.openInformation(null, “Text”, str);
}
});
toolItem2.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
text.setText(“”);
}
});
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
四、参考资料
SWT-JFace-Eclipse Demo
Eclipse的SWT使用ViewForm,ToolBar,ToolItem兼容问题解决
用Tree代替TableTree制作表格型树
解决java.lang.UnsupportedClassVersionError 错误
中山大学MSE-101 课程:面向对象技术与方法的PPT文档
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/103959.html