Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

BoxLayoutでJTree

BoxLayoutでJTreeを表示しようとした場合に、きれいに表示されない。PreferredSizeを変更してみたりしたんですがうまくいかない。
他のLayoutだと、表示されます。

ソース
import java.awt.Container;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

public class TestFrame extends JFrame {

  private static final long serialVersionUID = 1L;

  public TestFrame(){
    setTitle("Test");
    setSize(400,400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container contentPane = getContentPane();
    DefaultMutableTreeNode root = 
      new DefaultMutableTreeNode("Test");
    JTree tree = new JTree(root);
    BoxLayout bl = 
      new BoxLayout(contentPane,BoxLayout.Y_AXIS);
    contentPane.setLayout(bl);
    contentPane.add(tree);
    setVisible(true);
  }

  public static void main(String[] args) {
    new TestFrame();
  }
}

以上です。よろしくお願いします。

6

回答

9107

閲覧

6件の回答

評価

0

JTableとJTreeはスクロールペインに入れるのが、暗黙の常識です(どちらもランタイムに任意に拡大/縮小するのでプログラマ側もJava側も正しいサイズ計算が困難)。

BoxLayoutはコンポーネントのpreferred, minumum, maximumの3サイズ値をレイアウトのために使うので、この3つのsetXxxxSize()を適切に呼べばスクロールペインなしでも初期の表示は可能ですが、その後の変化に追随できるためには、やはり、スクロールペインに入れてやるべきです。

評価

0

>JTableとJTreeはスクロールペインに入れるのが、暗黙の常識です

ソースでは使いませんでしたが以下のようにスクロールペインを使っていました。
JTreeが複数の場合にスクロールペインに入れるとスクロールペインも複数になるので、スクロールペインを一つにしたいためにJTreeをBoxLayoutのパネルに追加して、そのパネルをスクロールペインに入れてます。

スクロールペインを一つにしたい場合は、暗黙の常識としてJTreeを複数使用するのは避けるべきでしょうか?

以上です。よろしくお願いします。

評価

0

JScrollPaneのビューコンポーネントはあくまでも一つですから、まず二つのJTreeをパネルかなにかに入れてやるといいですね。私は、レイアウトは、相当細かいことが自由にできるので、GridBagLayoutがいちばん好きです。そのほかの最新のレイアウトマネージャは、簡便性を重視して柔軟性を失っているようです(BoxLayoutでなくBoxは、けっこう小細工ができるので好きですが)。
------------------------
/*上記関連部分*/
JPanel panel = new JPanel();
panel.setBackground(Color.white);
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.anchor = GridBagConstraints.NORTHWEST;
panel.add(jomeiTree, c);
c.gridy = 1;
panel.add(demoTree, c);
JScrollPane jsp = new JScrollPane(panel);
contentPane.add(jsp, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
-------------------------------

評価

0

回答ありがとうございます。

>JScrollPaneのビューコンポーネントはあくまでも一つですから、まず二つのJTreeをパネルかなにかに入れてやるといいですね。

やっているのですが・・・。表示がおかしい。
JTreeのノードのアイコンは全て表示されていますが、アイコンの右に表示されるテキストが切れてしまいます。
---------------------------
JPanel panel = new JPanel();
BoxLayout bl = 
  new BoxLayout(panel,BoxLayout.Y_AXIS);
panel.setLayout(bl);
panel.add(tree1);
panel.add(tree2);
contentPane.add(new JScrollPane(panel));
---------------------------

パネルをBoxに変えても同様です。
---------------------------
Box panel = Box.createVerticalBox();
panel.add(tree1);
panel.add(tree2);
contentPane.add(new JScrollPane(panel));
---------------------------
パネルをBoxLayout以外のレイアウトにすると正常にテキストまで表示されます。

正常表示と確認したレイアウト
BorderLayout
GridLayout

以上です。よろしくお願いします。

評価

0

Box/BoxLayoutを使わなければならない理由があるんですか?(ないと思うけど)。JPanelの上のGridBagLayoutが無難ですよ。Box/BoxLayoutには、さっき申したような癖があるので、
setMinimumSize(), setMaximumSize(), setPreferredSize()の3つを適切なDimensionの値(例:3つとも同じで大きめ)で呼んでみてください。
良い参考記事:http://java.sun.com/docs/books/tutorial/uiswing/layout/box.html#size

評価

0

回答ありがとうございます。

Boxをでないといけない理由は特にありません。
今はGridLayoutにしてます。複雑になればGridBagLayoutにしようと思っています。
今後のために、Boxの使い方を知りたかったのです。

参考記事をよく読んでみます。

以上です。ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。