Java究竟怎么玩?

天地程序已定棋,人间大数待变局

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
昨天晚上看到有人询问,回答一下。

因为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 = {2518151283035};

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

            PieChart c 
= new PieChart(280240);

          
            c.setPieSize(
14013080);

            
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功能的例子,一会有时间整理下发上来。

posted on 2007-12-20 12:50  cping  阅读(401)  评论(0编辑  收藏  举报