16

質問を少し言い換える必要があると思います。

以下の質問を更新しました。

私は以下を含むJPanelを持っています:

myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));

次の3つのパネルが含まれています。

サイズが固定されたJPanel「x」および「y」

固定サイズのないJPanel

サイズが固定されておらず、高さが小さいJPanel

2番目のJPanelにはJTableが含まれているため、予想どおり、JTableが拡張して全高を埋め、下部パネルを完全に押し下げます。

このような:

t
t
m
m
m
m
m
b

t =上部パネル、m =中央パネル、b=下部パネル。

それはうまくいきます。しかし、下のパネルは、問題である親の幅全体を埋めるような気がしません。

ttt
mmm
 b 

パネルが幅全体を埋める、次のいずれかが必要です。

ttt
mmm
bbb

またはこれ、下部パネルが左中央にある場合:

ttt
mmm
b

以下の古い質問:

私は以下を含むJPanelを持っています:

.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));

その中には、さらに3つのJPanelがあります。最初の2つは固定サイズで、真ん中の2つは固定サイズではありません。

ボトムパネルに必要な高さだけをとらせたいのですが、外側のJPanelの利用可能なすべての幅を使用しています。

私は接着剤を使用しようとしましたが、役に立ちませんでした。優先サイズと最小/最大サイズを設定したくありません。レイアウトマネージャーとフレームワークだけを使用して、コンポーネントに「親の幅全体を埋める」ように指示する方法はありますか。サイズの設定やメソッドのオーバーライドなどのハックを始めたくありません。

注:内側のパネルに接着剤やフィラーを入れることはできません。変更できるのは外側のパネルとそのレイアウトマネージャーだけです。

試行1:

使用myPanel.setLayout(new GridLayout(3, 1));しても期待した結果は得られませんでした。次のようなグリッドを作成しました。

XX
 X

しかし、私は期待していました:

X
X
X

試行2:

使用myPanel.setLayout(new GridLayout(0,1));しても期待した結果は得られませんでした。次のようなグリッドを作成しました。

x
x
x

しかし、すべてのパネルは同じサイズであり、制約を無視していました。

4

4 に答える 4

20

GridLayout最も簡単な方法は、親コンテナを満たすようにコンポーネントのサイズを自動的に設定するなど、別のレイアウトマネージャーを使用することです。

myPanel.setLayout(new GridLayout(0, 1));
于 2013-01-10T13:57:18.140 に答える
9

を使用していBorderLayoutて、bパネルがSOUTHまたはPAGE_ENDにある場合は、幅全体が埋められます。

于 2013-01-10T14:50:08.377 に答える
3

GridBagLayoutを使用できます。そのために、

gridBagObject.fill = GridBagConstraints.HORIZONTAL

GridBagLayoutに関連するヘルプの1つの例。

コメントで尋ねられたように、それに関連して

BoxLayoutは、コンポーネントの推奨サイズを尊重するもう1つの代替手段です。GridBagLayoutがそれほど難しい場合は、それを試すことができます:-)

より明確にするために、GridBagLayoutを使用してコーディングします。

import javax.swing.*;
import java.awt.*;

/**
 * Created with IntelliJ IDEA.
 * User: Gagandeep Bali
 * Date: 1/10/13
 * Time: 7:43 PM
 */
public class GridBagExample
{
    private void displayGUI()
    {
        JFrame frame = new JFrame("GridBagLayout Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        CustomPanel topPanel = new CustomPanel(Color.BLUE.darker().darker());
        CustomPanel middlePanel = new CustomPanel(Color.CYAN.darker().darker());
        CustomPanel bottomPanel = new CustomPanel(Color.DARK_GRAY);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = GridBagConstraints.VERTICAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 0.3;

        contentPane.add(topPanel, gbc);

        gbc.gridy = 1;
        contentPane.add(middlePanel, gbc);

        gbc.gridy = 2;
        gbc.fill = GridBagConstraints.BOTH;
        contentPane.add(bottomPanel, gbc);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new GridBagExample().displayGUI();
            }
        });
    }
}

class CustomPanel extends JPanel
{
    public CustomPanel(Color backGroundColour)
    {
        setOpaque(true);
        setBackground(backGroundColour);
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(200, 150));
    }
}

出力:

GridBagExampleOutput

于 2013-01-10T14:07:17.997 に答える
-2

ここでは、いくつかのカスタムJPanelを使用して、静的入力値で拡張および縮小します。
Javaタイマーは、パネルの表示時間を遅らせてスピードアップするために使用しています。

 public class SlidingPanel extends JPanel {
 private int paneHeight;
 private int paneWidth;
 private int comHeight;
 private int comWidth;
 private Timer everyspeedmillisec;

/**custom class for slide up and down actions for JPanel
 * 
 */

public SlidingPanel(LayoutManager layout,Dimension panedim) {

    super(layout);  
    setPreferredSize(panedim);
    paneHeight = (int)panedim.getHeight();;
    paneWidth  = (int) panedim.getWidth(); 

}

    /**function for expanding Jpanel
 * 
 */

public void expand_sft_det(int speed ,JPanel slidingcom)
{

 //Add Jpanel for sliding 

    this.add(slidingcom);

//パネルの高さと幅を取得します。これは、スライドの高さとして表示するものです。

 comHeight=(int)slidingcom.getMinimumSize().getHeight();

 comWidth=(int) slidingcom.getMinimumSize().getWidth(); 

//いくつかの静的な値でタイマーを初期化-中速)

   everyspeedmillisec = new Timer(30, new ActionListener() {


       private int count_timer=0; 

       public void actionPerformed(ActionEvent e) {

       count_timer++;

         if( paneHeight < comHeight){

             setPreferredSize(new Dimension(paneWidth, paneHeight));

             paneHeight+=20;

             repaint();

             revalidate();

         }
         else

             everyspeedmillisec.stop() ;
    }


  });


  everyspeedmillisec.start(); 


}

/**Jpanelを縮小するための関数**/

public void shrink_sft_det(int speed ,JPanel slidingcom) {

 comHeight    = (int)slidingcom.getMinimumSize().getHeight();

     comWidth     = (int)slidingcom.getMinimumSize().getWidth();

//一番上の位置までスライドするための高さ

     paneHeight=0;

     everyspeedmillisec = new Timer(30, new ActionListener() {

     private int count_timer=0;

 public void actionPerformed(ActionEvent e) {

     count_timer++; 

     if( paneHeight < comHeight){

           setPreferredSize(new Dimension(comWidth,comHeight));

           comHeight-=20;

           repaint();

           revalidate();

     }
     else
       everyspeedmillisec.stop() ;

 }

});
everyspeedmillisec.start(); 

}

//クラスを宣言し、縮小するonclickイベントを使用します

public class SoftPanel extends JPanel implements ActionListener
, MouseListener {

JPanel MoredetPane;

JPanel SlidedetPane;

private JLabel SoftDOCLabel;

private JLabel SoftLocation;

private JLabel SoftUpdates;

private boolean mr_det_flag =true;



MoredetPane = new SlidingPanel(new GridLayout(1,1,5,5),new Dimension(300,1));

MoredetPane.setOpaque(false);

//Add some components 

        SlidedetPane = new JPanel(new GridLayout(3,2,50,25));

        SlidedetPane.setPreferredSize(new Dimension(300,200));

        SlidedetPane.setOpaque(false);

                SoftDOCLabel = new JLabel("Software Date") ;

            SoftLocation = new JLabel("Software Location") ;

        SoftUpdates  = new JLabel("Software Updates") ;


        SlidedetPane.add(SoftDOCLabel);

        SlidedetPane.add(new JLabel(softbean.getSoftDOC()));

        SlidedetPane.add(SoftLocation);

        SlidedetPane.add(new JLabel(softbean.getSoftPath()));  

        SlidedetPane.add( SoftUpdates);

        SlidedetPane.add(new JLabel(""));  

//Onclick events

      modedetails_Label.addMouseListener(new MouseAdapter() {


       @Override
       public void mousePressed(MouseEvent clickeve) {

           if(mr_det_flag){

              mr_det_flag=false;

                  ((SlidingPanel)MoredetPane).expand_sft_det(200,SlidedetPane);

                  add(SlidingPanel);
            }
            else{

            mr_det_flag=true;

          ((SlidingPanel) MoredetPane).shrink_sft_det(0,SlidedetPane);

            }


          });


    add( MoredetPane );

     }
于 2013-07-06T06:03:24.903 に答える