2009-03-26 22 views
4

コンテナのmaximumAvailableHeightを占有するコンポーネントを作成したいとします。私が下に貼り付けたコードでは、ルートフレームを800,600にしました。私はそのフレームの高さ/幅を設定したい(と私はその子供を試してピクセル化したくない)。私がこれを実行すると、ひどく整列したUIが表示されます。スイング:コンポーネントの高さをコンテナの高さに設定するにはどうすればよいですか?

まず、100%の高さ(この場合は800pxからフレームタイトルを塗りつぶすために必要なスペースを引いたもの)を取るために、パネル(ルートフレーム内にあります)が必要です。

第2に、パネル内にはツリーとテキストエリアがあります。私はそれらの両方が100%の高さを取るようにし、ツリーを30%、textAreaを70%の幅にします(ツリーが10レベルに拡大されていれば、ScrollPaneでOKです)。

これはHTMLで実現するのが最も簡単だと理解しています。ちょうど高さ= 100%、幅は30%などと言います。これがSwingでできるかどうか誰かが知っていますか? (私は、ピクセルの高さとレイアウトマネージャを設定することが、私は割合の高さと幅を設定するためのクリーンな解決策を探していますすることによって、これを達成することができます。)

package com.ekanathk.logger.gui; 

import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class TestFrame extends JFrame { 
    public TestFrame() { 
     super("Top Frame"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     JTree env = getEnvironmentTree(); 
     env.expandRow(0); 
     panel.add(new JScrollPane(env)); 
     panel.add(new JTextArea("Some contents")); 
     getContentPane().add(panel); 
     setSize(800, 600); 
     SwingUtil.centerComponentOnScreen(this); 
     setVisible(true); 
    } 

    private JTree getEnvironmentTree() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     JTree tree = new JTree(root); 
     DefaultMutableTreeNode one = new DefaultMutableTreeNode("One"); 
     root.add(one); 
     one.add(new DefaultMutableTreeNode("under one.1")); 
     one.add(new DefaultMutableTreeNode("under one.2")); 
     root.add(new DefaultMutableTreeNode("two")); 
     root.add(new DefaultMutableTreeNode("three")); 
     return tree; 
    } 

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

答えて

3

これは、あなたが何をしたいの並べ替えを行うためのGridBagLayoutを使用しています。あなたはコンポーネントのsetMinimumSizeとsetPreferedSizeで遊んでいるかもしれません。

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class TestFrame extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public TestFrame() { 
     super("Top Frame"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(new GridBagLayout()); 

     JTree env = getEnvironmentTree(); 
     env.expandRow(0); 

     GridBagConstraints c = new GridBagConstraints(); 
     c.fill = GridBagConstraints.BOTH; 
     c.weightx=.7; 
     c.weighty=1; 

     c.gridx=0; 
     c.gridy=0; 
     c.gridheight=1; 
     c.gridwidth=7; 
     panel.add(new JScrollPane(env),c); 

     c.weightx=.3; 
     c.gridx=7; 
     c.gridy=0; 
     c.gridheight=1; 
     c.gridwidth=GridBagConstraints.REMAINDER; 
     panel.add(new JTextArea("Some contents"),c); 

     add(panel); 
     setSize(800, 600); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private JTree getEnvironmentTree() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     JTree tree = new JTree(root); 
     DefaultMutableTreeNode one = new DefaultMutableTreeNode("One"); 
     root.add(one); 
     one.add(new DefaultMutableTreeNode("under one.1")); 
     one.add(new DefaultMutableTreeNode("under one.2")); 
     root.add(new DefaultMutableTreeNode("two")); 
     root.add(new DefaultMutableTreeNode("three")); 
     return tree; 
    } 

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

私はこのソリューションを使用していました。しかし、私の実際のアプリケーションでは、右ペインはテキストエリアだけではありません(実際には10以上のタブを持つJTabbedPaneです)。ツリーのテキストが長くなると、整列が狂ってしまった(私は思っていたsetMaximumSizeを持っていなければならない)。私は –

+0

をTableLayoutとしてhttp://java.sun.com/products/jfc/tsc/articles/tablelayout/で使用し、コードは魅力的に機能しました:) panel.setLayout(new TableLayout(new double [] [ ] {{0.3,0.7}、{TableLayout.FILL}})); panel.add(p1、 "0,0"); panel.add(p2、 "1,0"); –

+0

私は(現在)以下に投稿したスプリングレイアウトソリューションを試しましたか?これは、これよりもサイズを変更するように見えるという利点があります。 – KitsuneYMG

1

これを実現するでしょうlayout managersの数がある - のGridLayout(1x1のグリッド)、GridBagLayoutの、おそらくBorderLayoutには。

1

ここでは、SpringLayoutを使用する別のアプローチがあります。私はSpring.widthとSpring.heightを取得できませんでしたので、より冗長な方法を使用しました。

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTree; 
import javax.swing.Spring; 
import javax.swing.SpringLayout; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class TestFrame extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public TestFrame() { 
     super("Top Frame"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE);   
     SpringLayout layout = new SpringLayout(); 
     JTree env = getEnvironmentTree(); 
     env.expandRow(0); 
     JPanel contentPane = new JPanel(layout); 
     contentPane.setLayout(layout); 
     JScrollPane treePane = new JScrollPane(env); 
     JTextArea area = new JTextArea("Some contents"); 
     contentPane.add(treePane); 
     contentPane.add(area);   
     setLayout(new BorderLayout()); 
     add(contentPane); 
     setSize(800, 600); 

     SpringLayout.Constraints cons; 
     cons = layout.getConstraints(treePane); 
     cons.setX(Spring.constant(0)); 
     cons.setY(Spring.constant(0)); 
     cons.setWidth(Spring.scale(layout.getConstraint(SpringLayout.EAST, contentPane), .7f)); 
     cons.setHeight(layout.getConstraint(SpringLayout.SOUTH, contentPane)); 

     cons = layout.getConstraints(area); 
     cons.setX(layout.getConstraint(SpringLayout.EAST, treePane)); 
     cons.setY(Spring.constant(0)); 
     cons.setWidth(Spring.scale(layout.getConstraint(SpringLayout.EAST, contentPane), .3f)); 
     cons.setHeight(layout.getConstraint(SpringLayout.SOUTH, contentPane)); 
     setPreferredSize(getSize()); 
     setLocationRelativeTo(null); 
     pack(); 
     setVisible(true); 
    } 

    private JTree getEnvironmentTree() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     JTree tree = new JTree(root); 
     DefaultMutableTreeNode one = new DefaultMutableTreeNode("One"); 
     root.add(one); 
     one.add(new DefaultMutableTreeNode("under one.1")); 
     one.add(new DefaultMutableTreeNode("under one.2")); 
     root.add(new DefaultMutableTreeNode("two")); 
     root.add(new DefaultMutableTreeNode("three")); 
     return tree; 
    } 

    public static void main(String[] args) { 
     new TestFrame(); 
    } 
} 
関連する問題