在SWT里显示AWT对象 - 八进制 - 博客园(转载)

本文介绍如何在Eclipse插件中使用JFreeChart绘制图表。通过SWT-AWT桥接器实现在SWT应用中展示Java2D图形,并讨论了在SWT环境下使用JFreeChart的一些注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个问题,就是要在一个Eclipse插件里显示JFreeChart的图形,因为后者是基于Java2D的,要把图形显示在SWT应用程序里需要利用SWT-AWT桥接器来实现,虽说桥接的方式多半会伴随着性能下降,但总归是一个解决方法。

代码并不复杂,以下是一个片断:

public void createPartControl(Composite parent)  {
    parent.setLayout(
new FillLayout(SWT.VERTICAL));
    Composite drawarea = 
new Composite(parent, SWT.EMBEDDED);
    drawarea.setLayout(
new FillLayout());
    Frame canvasFrame = SWT_AWT.new_Frame(drawarea);
    canvas = 
new java.awt.Canvas()  {
        
public void paint(Graphics g)  {
            super.paint(g);
            
if (chart != null)
                chart.draw((Graphics2D) g, getBounds());
        }
    };
    canvasFrame.add(canvas);
}

关键之处在于SWT_AWT.new_Frame()方法,得到的是一个java.awt.Frame对象,要显示的AWT内容都放在它上面就好。

BTW, SWT下免费的图表工具好象很少,只能暂时先这样使用JFreeChart了。

Update: 如果要在SWT里显示带有动画效果的AWT图形,最好在Frame上先放一个JPanel这样的带有双缓冲的控件,否则图象在运动时会产生明显的闪烁。

posted on 2005-07-17 23:10 八进制 阅读(2921) 评论(6)  编辑 收藏 网摘 所属分类: Java

 

评论

 

#1  2005-09-13 17:14 YYQQ [未注册用户]

不知道您是否遇到过这样的需求:要在一个GEFEditor中显示SWT控件?这时该怎么办呢?
  回复  引用    

 

#2 [楼主] 2005-09-13 22:53 八进制      

其实现在我就在为一个类似的问题烦恼,而且我还没有想出什么好办法。
Draw2d
里倒有一些简单的控件(Clickable的子类)可以放在editor里,我想你多半也知道了。
  回复  引用  查看    

 

#3  2005-09-14 12:14 YYQQ [未注册用户]

这个我已作过试验。感觉这些控件较难控制,需要设置太多的东西。另外,还缺少如TableTree等对象,如果自己做也是很麻烦。苦恼中
  回复  引用    

 

#4  2006-05-29 17:29 baal [未注册用户]

八进制你好,我想问下如何在得到或判断出table中看不见的column?
  回复  引用    

 

#5  2006-10-31 15:52 路过 [未注册用户]

canvas = new java.awt.Canvas() {
public void paint(Graphics g) {
super.paint(g);
if (chart != null)
chart.draw((Graphics2D) g, getBounds());
}
};
canvasFrame.add(canvas);
___________________________________________________________
干吗不这样呢?

canvasFrame.add(new ChartPanel(chart));

Java中,你可以使用Swing库来创建图形用户界面(GUI)。下面是一个简单的示例,展示了如何实现你描述的菜单结构: ```java import javax.swing.*; import java.awt.*; public class BinaryDecimalConverter extends JFrame { private JMenuBar menuBar; private JMenu fileMenu; private JMenuItem binaryOption; private JMenuItem octalOption; private JMenuItem decimalOption; public BinaryDecimalConverter() { setTitle("Binary to Decimal Converter"); setSize(400, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建菜单栏 menuBar = new JMenuBar(); setJMenuBar(menuBar); // 创建文件菜单 fileMenu = new JMenu("File"); menuBar.add(fileMenu); // 创建选项 binaryOption = new JMenuItem("Binary"); binaryOption.addActionListener(e -> convertToDecimal("binary")); fileMenu.add(binaryOption); octalOption = new JMenuItem("Octal"); octalOption.addActionListener(e -> convertToDecimal("octal")); fileMenu.add(octalOption); decimalOption = new JMenuItem("Decimal (Default)"); decimalOption.addActionListener(e -> convertToDecimal("decimal")); fileMenu.add(decimalOption); // 添加语言切换 JMenuItem languageItem = new JMenuItem("Chinese"); languageItem.addActionListener(e -> changeLanguage()); menuBar.add(languageItem); // 创建主窗口内容区域 Container contentPane = getContentPane(); contentPane.setLayout(new FlowLayout()); // 实现默认的转换功能(例如,显示欢迎消息) String defaultMessage = "Welcome! Choose a conversion type."; JLabel welcomeLabel = new JLabel(defaultMessage); contentPane.add(welcomeLabel); } private void changeLanguage() { // 这只是一个示例,实际需要根据当前选择的语言更改界面文本 System.out.println("Language changed to Chinese."); } private void convertToDecimal(String base) { // 这也需要添加实际的转换逻辑,比如使用Integer.parseInt()等函数 System.out.println("Converting to decimal based on " + base); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { new BinaryDecimalConverter().setVisible(true); }); } } ``` 在这个例子中,我们创建了一个`BinaryDecimalConverter`类,它包含了一个`JFrame`窗体。菜单结构通过`JMenuBar`, `JMenu`, 和 `JMenuItem`实现。点击相应的选项会触发`convertToDecimal`方法,而"中文"选项仅打印一条消息,实际翻译需根据实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值