2009-07-15 7 views
0

私は、埋め込みブラウザとActiveXの両方をサポートする必要があるJava Swingアプリケーションを構築しています。これを行う簡単な方法は、JDICplusを使用するように見えました。これはIEをアプリケーションに埋め込むだけです。それは両方の要件をカバーしていました。JDICplusをJavaでIEを埋め込む問題

また、このブラウザビューの上部にいくつかのボタンをオーバーレイする必要があります。これにより、ユーザーはビュー間を移動できます。これを行うために、私はJLayeredPaneを持っています。これにはビューを追加し、上位レイヤにはボタンを追加します。これは純粋なJavaビューで動作します。しかし、私のインターネットビューでは、インターネットはボタンの上に描かれています。つまり、JLayeredPaneを尊重するようには見えません。私はそれがネイティブコンポーネントであり、Javaコンポーネントではないので、これは推測しています。

インターネットペインをJInternalFrameに入れ、もう一方のボタンを押して、両方の内部フレームをJDesktopPaneに配置します。ボタンフレームをインターネットフレームの上にドラッグすると、インターネットフレームがフォアグラウンドにジャンプし、他のフレームをカバーします。埋め込まれたIEがフォーカスを奪って、他のウィンドウの最前線にいるかのようです。

私の質問は、これらのWindows/IEコンポーネントの上にJavaコンポーネントを確実に描画する方法はありますか?それとも、JavaとIEを混在させることはありませんか?埋め込みブラウザとActiveXサポートの要件を満たすための他の選択肢がありますか(技術的には別の見方、つまりインターネットビューとActiveXだけをサポートする別のビューを持つことができます)。私は提案に開放されています。私はJavaのための他の無料のブラウザコンポーネントを見てきました。誰もがあなたに伝えるように、それは落胆しています。

+0

あなたは私はあなたがより良いのWindows固有のソリューションを見ているだろうと思うようにWindowsの特定の技術を必要とする場合、私のJavaの経験を考えます。残念ながら、私はもっと具体的な何かを提案することはできません。 – Mark

答えて

2

Sunの記事mixing heavy and light componentsをチェックしてください.JDICPlusは基本的にIEをあなたのアプリに埋め込んでいるので、重いコンポーネントです。

他の重量コンポーネント(AWT Buttonなど)を使用してブラウザウィンドウにボタンを配置することや、setDefaultLightWeightPopupEnabled(false)を設定してブラウザ上に配置されたJPopupMenuにボタンを配置することなどがありますそれはヘビー級です。

編集

私はヘビー級コンポーネント上のJButtonを表示するのPopupMenuを使用した例を書いた - 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とスクリーンショットです - あなたはまた、あなたが扱っているとして、任意のクールな透明効果を行うことができなくなりますのでご注意重量のあるコンポーネントで

screenshot of code http://i30.tinypic.com/2zsbdsl.png

+0

はい、これはまさに問題です - その記事へのリンクありがとう!しかし、私はタッチスクリーンアプリケーションを構築しているので、メニューの代わりに大きなボタンを使用する必要があります。たぶん私はIEの上にレンダリングすることができますので、私はボタンのイメージを置くことができるようにするために私はボタンを使用したくないいくつかの種類のヘビー級コンポーネントにJButtonを得ることができる方法があります... – dave4351

+0

しかし、JPopupMenuはメニュー以上のものを保持することができます - コードとスクリーンショットで投稿を更新します。 – Nate

+0

それは素晴らしいです - ありがとう! – dave4351