- PR -

JDesktopPaneでスクロールバーは出ないのでしょうか?

1
投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-10-23 10:07
こんにちは。お世話になってます。

今、SwingのJDesktopPaneを使ってMDIのフォームを作っています。
で、親フレーム(JDesktopPane)の領域、子フレーム(JInternalFrame)がはみ出ると、
Windows等ではスクロールバーが表示されますが、JDesktopPaneではスクロールバー
が出ません。JDesktopPaneでスクロールバーを実装する方法をご存知の方、おられま
せんでしょうか?よろしくお願いします。

OS:Win2000
JDK:1.4.X
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-10-23 13:20
こんにちは、Wataです。

試してはいませんが、次の方法で可能だと思います。
・まず、JDesktopPaneをJScrollPaneに入れて親フレームに配置してする。
・インナーフレームにComponentListenerを追加して、移動、リサイズなどの
イベントを監視して、必要に応じてJDesktopPaneのサイズを変更する

ちなみにWindowsアプリケーションでもスクロールバーの出るものと、
出ないものがあるようですね。(Excel2002無し、Access2000ありなど)
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-10-23 13:29
素直な感想として、JTabbedPaneじゃだめなの?
scrollerを気にする必要がなくなると思うのだけど...
# きっと、仕様としてMDI styleが指定されているのだろう。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-10-23 13:55
サンプルを作ってみました。
コード:
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;

public class DeskTopPaneTest extends JFrame{

   public static void main(String[] args) {

      DeskTopPaneTest f = new DeskTopPaneTest("DeskTopPaneTest");

      f.setSize(300,300);
      f.show();
   }

   public DeskTopPaneTest(String title) {
      super(title);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      final JDesktopPane pane = new JDesktopPane();
      final JScrollPane scroll = new JScrollPane(pane);
      getContentPane().add(scroll);
      
      final JInternalFrame frame = new JInternalFrame("hoge");
      frame.addComponentListener(new ComponentAdapter() {
         public void componentMoved(ComponentEvent e) {
            int pw = pane.getWidth();
            int ph = pane.getHeight();
            
            int fxw = frame.getX() + frame.getWidth();
            int fyh = frame.getY() + frame.getHeight();
            
            if(pw < fxw){
               pw = fxw;
            }
            else if(pw > scroll.getWidth()){
               pw = scroll.getViewport().getWidth();
            }
            if(ph < fyh){
               ph = fyh;
            }
            else if(ph > scroll.getHeight()){
               ph = scroll.getViewport().getHeight();
            }
            
            pane.setPreferredSize(new Dimension(pw, ph));
            scroll.validate();
         }
      });
         
      pane.add(frame);
      
      frame.setSize(100,100);
      frame.show();
   }
}


いちおうスクロールできます。
ただし、スクロールバーがちらついたり、インナーフレームの描画が乱れたりすることがあります。
実用にはもう一つ、二つ功夫が要りそうですね。

# ちなみに私もMDIよりタブ式の方が使いやすいと思ってるけど
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-10-23 14:14
こんにちは。

サンプルまで作っていただいてありがとうございました。
こちらでも、JScrollPaneとComponentListenerを連携してやっては見たのですが、
うまくいきませんでした。
このソースを参考に検討します。

なお、今は画像処理系のソフトを作ってまして、子フレーム同士を並べて見たり、統計や
解析結果などいろんな子フレームを表示するのでMDIである必要があります。

言われてみると、Windows用ソフトでもスクロールバーの出ない物も多いようですね。
OSの機能というより開発者側にゆだねられているようですね。
Bikki
会議室デビュー日: 2003/02/05
投稿数: 5
投稿日時: 2003-10-26 08:18

方法はあります。前に同じことをしようとしたのですが、そのときに
見つけたのがまさに「JScrollableDesktopPane」というものです。
これを使えば簡単にできます。

URLを失念したのですが、上記でGoogleから検索すれば見つかります。

># ちなみに私もMDIよりタブ式の方が使いやすいと思ってるけど
好みの問題とは思いますが、私は圧倒的にMDIの方が使いやすいと思っ
ています。(このためだけでEclipseよりもNetBeanを使っているよう
なもんです)
私はNetBeanを愛用していますが、これもまさにスクローラブルなMDI
になっています。

1

スキルアップ/キャリアアップ(JOB@IT)