昨天晚上看到有人询问,回答一下。
因为JFrame继承自Frame,是父子关系,所以Frame不能强转为JFrame使用。但是,却有取巧的方法令SWT操作Swing~
//JFrame实例
JFrame frame = new JFrame();
//获得容器
Container container = frame.getContentPane();
//画布
Canvas canvas = new Canvas();
//容器加载画布
container.add(canvas,BorderLayout.CENTER);
//显示
frame.setVisible(true);
//获得Display
Display display = new Display();
//转换canvas不就得了~~~为什么能转换?看看Frame继承自谁就知道了……
Shell shell = SWT_AWT.new_Shell(display,canvas);
//布局
shell.setLayout(new FillLayout());
//SWT按钮加载
Button button = new Button(shell,SWT.PUSH);
button.setText("SWT使用JFrame");
shell.pack();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()){
display.sleep ();
}
}
另外,再说一种利用new_Frame的方式,先写一个ChartDirector例子,应用了两个类。
DemoModule....java
packageorg.test.chartdir;


/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/

publicinterfaceDemoModule...{

publicStringtoString();

publicintgetNoOfCharts();

publicvoidcreateChart(ChartDirector.ChartViewerviewer,intindex);

}
CakyDemo.java
packageorg.test.chartdir;

importChartDirector.ChartViewer;
importChartDirector.PieChart;


/***//**
*<p>Title:LoonFramework</p>
*<p>Description:</p>
*<p>Copyright:Copyright(c)2007</p>
*<p>Company:LoonFramework</p>
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/

publicclassCakyDemoimplementsDemoModule...{


publicStringtoString()...{return"ChartDirector饼图";}


publicintgetNoOfCharts()...{return2;}

publicvoidcreateChart(ChartViewerviewer,intindex)

...{
intangle=0;
booleanclockwise=true;

if(index!=0)...{
angle=90;
clockwise=false;
}


double[]data=...{25,18,15,12,8,30,35};


String[]labels=...{"Labor","Licenses","Taxes","Legal","Insurance",
"Facilities","Production"};

PieChartc=newPieChart(280,240);


c.setPieSize(140,130,80);


if(clockwise)...{
c.addTitle("Start"+angle);

}else...{
c.addTitle("Start"+angle);
}

c.setStartAngle(angle,clockwise);

c.set3D();

c.setData(data,labels);

c.setExplode(0);

viewer.setImage(c.makeImage());

viewer.setImageMap(c.getHTMLImageMap("clickable","",
"title='{label}:US${value}K({percent}%)'"));
}

}

我构建一个ShellSwingToSWT.java用作演示:
packageorg.test.chartdir;

importjava.awt.BorderLayout;

importjava.awt.Canvas;

importjava.awt.Container;
importjava.awt.FlowLayout;
importjava.awt.Frame;
importjava.awt.GridLayout;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;

importjavax.swing.JFrame;

importorg.eclipse.swt.SWT;
importorg.eclipse.swt.awt.SWT_AWT;
importorg.eclipse.swt.graphics.Point;
importorg.eclipse.swt.layout.FillLayout;

importorg.eclipse.swt.widgets.Composite;
importorg.eclipse.swt.widgets.Display;
importorg.eclipse.swt.widgets.Shell;

importChartDirector.ChartViewer;


/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/

publicclassShellSwingToSWT...{


publicstaticvoidmain(String[]args)...{

intwidth=600;

intheight=400;
//ChartDirector测试
DemoModuledemo=newCakyDemo();

JFrameframe=newJFrame(demo.toString());


frame.addWindowListener(newWindowAdapter()...{

publicvoidwindowClosing(WindowEvente)...{
System.exit(0);
}
});
frame.getContentPane().setLayout(newFlowLayout(FlowLayout.LEFT));
frame.setSize(width,height);


for(inti=0;i<demo.getNoOfCharts();++i)...{
ChartViewerviewer=newChartViewer();
demo.createChart(viewer,i);
frame.getContentPane().add(viewer);
}

//获得容器
Containercontainer=frame.getContentPane();

Displaydisplay=newDisplay();

Shellshell=newShell(display,SWT.CLOSE);
shell.setSize(newPoint(width,height));
shell.setLayout(newFillLayout());
shell.setText("ChartDirectorinSWT");
//新建swt组件
Compositecomposite=newComposite(shell,SWT.NO_BACKGROUND
|SWT.EMBEDDED);
//注入组件,并返回为frame
Framefrm=SWT_AWT.new_Frame(composite);
//加载容器
frm.add(container);
//打开shell
shell.open();

while(!shell.isDisposed())...{

if(!display.readAndDispatch())...{
display.sleep();
}

}
}

}
其实也没什么可说的,只不过利用转换后的Frame载入JFrame的container罢了。
这两种方式都可以实现Swing在SWT中的显示

只不过第一种利用Swing窗体的hWnd实例,一种在新建窗体中显示Frame罢了。
关于AWT/Swing在SWT中显示的原理其实很简单,为此昨天还写了个在AWT/Swing实现SWT功能的例子,一会有时间整理下发上来。
因为JFrame继承自Frame,是父子关系,所以Frame不能强转为JFrame使用。但是,却有取巧的方法令SWT操作Swing~
//JFrame实例
JFrame frame = new JFrame();
//获得容器
Container container = frame.getContentPane();
//画布
Canvas canvas = new Canvas();
//容器加载画布
container.add(canvas,BorderLayout.CENTER);
//显示
frame.setVisible(true);
//获得Display
Display display = new Display();
//转换canvas不就得了~~~为什么能转换?看看Frame继承自谁就知道了……
Shell shell = SWT_AWT.new_Shell(display,canvas);
//布局
shell.setLayout(new FillLayout());
//SWT按钮加载
Button button = new Button(shell,SWT.PUSH);
button.setText("SWT使用JFrame");
shell.pack();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()){
display.sleep ();
}
}
另外,再说一种利用new_Frame的方式,先写一个ChartDirector例子,应用了两个类。
DemoModule....java
































CakyDemo.java








































































我构建一个ShellSwingToSWT.java用作演示:










































































































其实也没什么可说的,只不过利用转换后的Frame载入JFrame的container罢了。
这两种方式都可以实现Swing在SWT中的显示

只不过第一种利用Swing窗体的hWnd实例,一种在新建窗体中显示Frame罢了。
关于AWT/Swing在SWT中显示的原理其实很简单,为此昨天还写了个在AWT/Swing实现SWT功能的例子,一会有时间整理下发上来。