昨天晚上看到有人詢問,回答一下。
因為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
package org.test.chartdir;

/**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public interface DemoModule {

public String toString();

public int getNoOfCharts();

public void createChart(ChartDirector.ChartViewer viewer, int index);

}
CakyDemo.java
package org.test.chartdir;

import ChartDirector.ChartViewer;
import ChartDirector.PieChart;

/**
* <p>Title: LoonFramework</p>
* <p>Description:</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company: LoonFramework</p>
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class CakyDemo implements DemoModule{
public String toString() { return "ChartDirector餅圖"; }

public int getNoOfCharts() { return 2; }

public void createChart(ChartViewer viewer, int index)
{
int angle = 0;
boolean clockwise = 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"};

PieChart c = new PieChart(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用作演示:
package org.test.chartdir;

import java.awt.BorderLayout;

import java.awt.Canvas;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import ChartDirector.ChartViewer;

/**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class ShellSwingToSWT {

public static void main(String[] args) {

int width = 600;

int height = 400;
// ChartDirector測試
DemoModule demo = new CakyDemo();

JFrame frame = new JFrame(demo.toString());

frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
frame.setSize(width, height);

for (int i = 0; i < demo.getNoOfCharts(); ++i) {
ChartViewer viewer = new ChartViewer();
demo.createChart(viewer, i);
frame.getContentPane().add(viewer);
}

// 獲得容器
Container container = frame.getContentPane();

Display display = new Display();

Shell shell = new Shell(display, SWT.CLOSE);
shell.setSize(new Point(width, height));
shell.setLayout(new FillLayout());
shell.setText("ChartDirector in SWT");
// 新建swt組件
Composite composite = new Composite(shell, SWT.NO_BACKGROUND
| SWT.EMBEDDED);
// 注入組件,并返回為frame
Frame frm = 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
package org.test.chartdir;
/**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public interface DemoModule {
public String toString();
public int getNoOfCharts();
public void createChart(ChartDirector.ChartViewer viewer, int index);
}
CakyDemo.java
package org.test.chartdir;
import ChartDirector.ChartViewer;
import ChartDirector.PieChart;
/**
* <p>Title: LoonFramework</p>
* <p>Description:</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company: LoonFramework</p>
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class CakyDemo implements DemoModule{
public String toString() { return "ChartDirector餅圖"; }
public int getNoOfCharts() { return 2; }
public void createChart(ChartViewer viewer, int index)
{
int angle = 0;
boolean clockwise = 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"};
PieChart c = new PieChart(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用作演示:
package org.test.chartdir;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import ChartDirector.ChartViewer;
/**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class ShellSwingToSWT {
public static void main(String[] args) {
int width = 600;
int height = 400;
// ChartDirector測試
DemoModule demo = new CakyDemo();
JFrame frame = new JFrame(demo.toString());
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
frame.setSize(width, height);
for (int i = 0; i < demo.getNoOfCharts(); ++i) {
ChartViewer viewer = new ChartViewer();
demo.createChart(viewer, i);
frame.getContentPane().add(viewer);
}
// 獲得容器
Container container = frame.getContentPane();
Display display = new Display();
Shell shell = new Shell(display, SWT.CLOSE);
shell.setSize(new Point(width, height));
shell.setLayout(new FillLayout());
shell.setText("ChartDirector in SWT");
// 新建swt組件
Composite composite = new Composite(shell, SWT.NO_BACKGROUND
| SWT.EMBEDDED);
// 注入組件,并返回為frame
Frame frm = 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功能的例子,一會有時間整理下發上來。

浙公網安備 33010602011771號