0

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

我还需要在此浏览器视图上覆盖一些按钮,以便用户可以在视图之间导航。为此,我有一个JLayeredPane,我在其中添加视图,并在更高的层添加按钮。这适用于我的纯 Java 视图。但是,在我的 Internet 视图中,Internet 绘制在按钮之上。换句话说,它似乎不尊重 JLayeredPane。我猜这是因为它是本机组件而不是 Java 组件。

可以肯定的是,我将 Internet 窗格放入JInternalFrame中,将按钮放入另一个中,并将两个内部框架放入 JDesktopPane 中。当我拖动 Internet 框架顶部的按钮框架时,Internet 框架跳到前台并覆盖了另一个框架。就好像嵌入式 IE 抢了焦点,把自己放在我其他窗口的最前面。

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

4

1 回答 1

2

查看 Sun 关于混合重型和轻型组件的文章- 因为 JDICPlus 基本上将 IE 嵌入到您的应用程序中,所以它是一个重量级组件。

您可以使用其他重量级组件(即 AWT 按钮)将按钮放置在浏览器窗口上,或者执行类似将按钮放置在浏览器上的 JPopupMenu 中并设置 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 的屏幕截图 - 请注意,由于您正在处理重量级组件,因此您也无法制作任何很酷的透明效果。

代码截图

于 2009-07-16T03:31:40.127 回答