2012-04-11 6 views
3

現在表示されているコンテンツの概要を開いてナビゲートできるスクロールペイン/ビューポートの拡張機能であるSwingコンポーネントを探しています。 私はこのようなコンポーネントを示しているが、もはやそのコンポーネントを見つけることができない、過去のモンタージュ(年?)のいくつかのブログ記事を見たことは確かです。ここで概要を示すスクロールペイン/ビューポートスイングコンポーネント

は、私が探しています何の絵です:

scrollpane with overview

あなたは、このようなポストを覚えているか、あなたのしおりでいくつかのリンクを持っている場合、私は情報を共有するためにあなたに感謝したい場合。

ありがとうございました。

+0

も、この[解答](http://stackoverflow.com/a/10097538/230513)を参照してください。 – trashgod

答えて

1

可能と

1からJComponent(s)であり)GlassPane

2)JXLayer(Java6の)に基づいてJLayer (Java7)

3)JViewport

4)Translucent JDialog

+0

ありがとうございましたが、私はこのような既存の貢献がすでに他の誰かによって行われ公開されていることを確信しているので、ホイールを再発明することを避けたいと思います。 –

+0

申し訳ありませんが、私がしたい場合は、[GlassPane](http://stackoverflow.com/a/10059295/714968)を使用して、数時間ごとにこの仕事を行うことができます、私のポイントMouseEventsをデフォルトでブロックしていますが、キーボードイベントはモーダルJDialogのみを使用することができます... – mKorbel

2
の位置決め

ここでは実際の例ですが、 java-image-scalingライブラリー(そのLGPL) - それは、プレビュー画像のスムーズなスケーリングのために使用され、そうでない場合は、あなたが完全に台無し画像を取得する:

public static void main (String[] args) 
{ 
    final JFrame mainFrame = new JFrame(); 

    JPanel content = new JPanel (new GridLayout (20, 20)); 
    for (int i = 0; i < 20; i++) 
    { 
     for (int j = 0; j < 20; j++) 
     { 
      content.add (new JLabel ("Test " + i + ":" + j) 
      { 
       { 
        setBorder (BorderFactory.createEmptyBorder (20, 20, 20, 20)); 
       } 
      }); 
     } 
    } 

    final JScrollPane pane = new JScrollPane (content); 
    pane.setCorner (JScrollPane.LOWER_TRAILING_CORNER, new JButton() 
    { 
     { 
      final JButton button = this; 
      addActionListener (new ActionListener() 
      { 
       public void actionPerformed (ActionEvent e) 
       { 
        JComponent comp = (JComponent) pane.getViewport().getView(); 
        Dimension size = comp.getSize(); 
        Rectangle viewRect = comp.getVisibleRect(); 

        // Drawing preview 
        BufferedImage image = new BufferedImage (size.width, size.height, 
          BufferedImage.TYPE_INT_RGB); 
        Graphics2D g2d = image.createGraphics(); 
        comp.print (g2d); 
        g2d.dispose(); 

        // Rescaling preview 
        int width = 200; 
        int height = comp.getHeight() * width/comp.getHeight(); 
        BufferedImage rescaled = 
          new ResampleOp (width, height).filter (image, null); 

        // Drawing view rect 
        float diff = (float)width/size.width; 
        g2d = rescaled.createGraphics(); 
        g2d.setPaint (Color.RED); 
        g2d.drawRect (Math.round (viewRect.x * diff), 
          Math.round (viewRect.y * diff), 
          Math.round (viewRect.width * diff), 
          Math.round (viewRect.height * diff)); 
        g2d.dispose(); 

        // Displaying preview 
        final JDialog preview = new JDialog (mainFrame); 
        preview.setUndecorated (true); 
        preview.add (new JLabel (new ImageIcon (rescaled)) 
        { 
         { 
          setBorder (BorderFactory.createLineBorder (Color.BLACK)); 
          setFocusable (true); 
         } 
        }); 
        Point los = button.getLocationOnScreen(); 
        preview.setSize (width + 2, height + 2); 
        preview.setLocation (los.x - width - 2, los.y - height - 2); 
        preview.setVisible (true); 

        preview.requestFocus(); 
        preview.addFocusListener (new FocusAdapter() 
        { 
         public void focusLost (FocusEvent e) 
         { 
          preview.dispose(); 
         } 
        }); 
       } 
      }); 
     } 
    }); 
    mainFrame.add (pane); 

    mainFrame.setSize (600, 600); 
    mainFrame.setLocationRelativeTo (null); 
    mainFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    mainFrame.setVisible (true); 
} 

だから、基本的に私はパネルのスナップショットを作成し、それを再スケールし、その小さなダイアログに置きますボタンの近くで開き、焦点を失うと閉じます。スナップショットの作成には時間がかかるかもしれませんが、スクロールペインコンテナ全体のレンダリングされたプレビューを作成するための良い方法はわかりません。プレビューを表示するものにペイントする必要があります。あなたがプレビューダイアログ上RED RECTをドラッグすることで、目に見える矩形を移動することができるように

また、あなたは簡単にプレビューコンポーネントを変更することができます:)

+0

こんにちは、それは良い出発点ですが、私はまだ考えているコンポーネントを見つけようとします。 –

+0

私はSwingX examplersのようなものを見たことを覚えています - あなたはそこにチェックするかもしれません。しかし、それについては確信していません... –