JDICplus在Java中嵌入IE的问题

JDICplus在Java中嵌入IE的问题,java,swing,browser,activex,embed,Java,Swing,Browser,Activex,Embed,我正在构建一个Java Swing应用程序,它需要同时支持嵌入式浏览器和ActiveX。实现这一点的简单方法似乎是使用,它只是将IE嵌入到您的应用程序中。这将涵盖这两项要求 我还需要在此浏览器视图顶部覆盖一些按钮,以便用户可以在视图之间导航。要做到这一点,我有一个可以添加视图的窗口,在更高的一层,还有按钮。这在我的纯Java视图中起作用。然而,在我的互联网视图中,互联网在按钮的顶部绘制。换句话说,它似乎不尊重JLayeredPane。我猜这是因为它是本机组件而不是Java组件 可以肯定的是,我将

我正在构建一个Java Swing应用程序,它需要同时支持嵌入式浏览器和ActiveX。实现这一点的简单方法似乎是使用,它只是将IE嵌入到您的应用程序中。这将涵盖这两项要求

我还需要在此浏览器视图顶部覆盖一些按钮,以便用户可以在视图之间导航。要做到这一点,我有一个可以添加视图的窗口,在更高的一层,还有按钮。这在我的纯Java视图中起作用。然而,在我的互联网视图中,互联网在按钮的顶部绘制。换句话说,它似乎不尊重JLayeredPane。我猜这是因为它是本机组件而不是Java组件

可以肯定的是,我将Internet窗格放在了一个中,将按钮放在了另一个中,并将两个内部框架都放在了一个JDesktopPane中。当我拖动互联网框架顶部的按钮框架时,互联网框架跳转到前景并覆盖另一个框架。这就好像嵌入式IE窃取了焦点,并将自己置于我其他窗口的前列


我的问题是:有没有办法在这些Windows/IE组件之上可靠地绘制Java组件?或者,把Java和IE混合在一起,我会一事无成吗?是否有其他选项可以满足我对嵌入式浏览器和ActiveX支持的要求(从技术上讲,这可能是一个不同的视图——换句话说,我可以有一个Internet视图和另一个仅支持ActiveX的视图)。我愿意接受建议。我已经看过了Java的其他免费浏览器组件,每个人都会告诉你,这是令人沮丧的。

看看Sun的文章-由于JDICPlus基本上将IE嵌入到你的应用程序中,它是一个重量级组件

您可以使用其他重量级组件(即AWT按钮)将按钮放置在浏览器窗口上,或者执行类似操作,如将按钮放置在浏览器上方的JPOppMenu中,并在其上设置setDefaultLightWeightPopupEnabled(false)以使其重量级

已编辑

我编写了一个使用JPopupMenu在重量级组件上显示JButton的示例—JPopupMenu可以工作,但它确实具有内置行为,可以在弹出窗口或弹出窗口中的组件失去焦点时关闭菜单。我在重量级组件中添加了一个MouseMotionListener,以便在鼠标进入按钮所在位置附近的边界框时显示弹出窗口。不确定这是否适用于您,因为按钮并不总是显示

包括一个代码示例和屏幕截图-

import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;

public class LightHeavy extends JFrame {

    private Component heavyweightComponent;
    private JPopupMenu backButton, forwardButton;

    public LightHeavy() {
        super("LightHeavy");
        heavyweightComponent = buildHeavyweightComponent();
        heavyweightComponent.setBackground(Color.ORANGE);
        heavyweightComponent.setSize(640, 480);
        getContentPane().add(heavyweightComponent, BorderLayout.CENTER);
        ImageIcon backArrow = new ImageIcon("left_arrow_128.png");
        backButton = buildPopup(backArrow);
        ImageIcon forwardArrow = new ImageIcon("right_arrow_128.png");
        forwardButton = buildPopup(forwardArrow);
        heavyweightComponent.addMouseMotionListener(new MouseInputAdapter() {
            public void mouseMoved(MouseEvent e) {
                Rectangle backHotSpot = new Rectangle(0, 0, 200, 200);
                Rectangle forwardHotSpot = new Rectangle(heavyweightComponent.getWidth() - 200, 0, 200, 200);
                if (backHotSpot.contains(e.getPoint())) {
                    backButton.show(heavyweightComponent, 0, 0);
                } else if (forwardHotSpot.contains(e.getPoint())) {
                    forwardButton.show(heavyweightComponent,
                            heavyweightComponent.getWidth() - forwardButton.getWidth(), 0);
                }
            }
        });

    }

    private Component buildHeavyweightComponent() {
        return new Canvas() {
            public void paint(Graphics og) {
                super.paint(og);
                Graphics2D g = (Graphics2D)og;

                String big = "Heavyweight Component";
                g.setFont(getFont().deriveFont(20F));
                Rectangle2D bigBounds = g.getFontMetrics().getStringBounds(big, g);
                g.drawString(big,
                        (this.getWidth() - (int)bigBounds.getWidth()) / 2,
                        (this.getHeight() - (int)bigBounds.getHeight()) / 2);

                String little = "(assume this is JDICplus)";
                g.setFont(getFont().deriveFont(10F));
                Rectangle2D littleBounds = g.getFontMetrics().getStringBounds(little, g);
                g.drawString(little,
                        (this.getWidth() - (int)littleBounds.getWidth()) / 2,
                        (this.getHeight() + (int)littleBounds.getHeight()) / 2);
            }
        };
    }

    private JPopupMenu buildPopup(Icon icon) {
        JButton button = new JButton(icon);
        JPopupMenu popup = new JPopupMenu();
        popup.add(button);
        popup.setBorderPainted(false);
        popup.setLightWeightPopupEnabled(false);
        return popup;
    }

    public static void main(String[] args) {
        JFrame f = new LightHeavy();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
这是一个屏幕截图,左边显示的是JButton——请注意,在处理重量级组件时,您也无法实现任何酷的透明效果


考虑到我的Java经验,如果您需要Windows特定的技术,我认为您最好考虑Windows特定的解决方案。可悲的是,我不能提出任何更具体的建议。是的,这正是问题所在——感谢链接到那篇文章!但由于我正在构建一个触摸屏应用程序,我需要使用大按钮而不是菜单。也许有一种方法我可以把一个JButton放到某种重量级组件中,这样我就可以在IE上进行渲染…我希望能够把图像放到按钮中,这样我就不想使用按钮了…但是一个JPOppMenu可以容纳的不仅仅是一个菜单-我会用代码和屏幕截图更新我的帖子。