2016-04-27 17 views
1

は、私は、次のクラスGridBagLayoutのアンカー&JScrollPaneのは

public class Demo { 

private JFrame mainFrame; 

static public Color BGCOLOUR1 = new Color(240, 240, 240); 

public Demo() { 
    mainFrame = new JFrame("Demo"); 
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainFrame.setLayout(new BorderLayout()); 
    mainFrame.setSize(900, 800); 

    JPanel centralPanel = new JPanel(); 
    centralPanel.setOpaque(true); 
    centralPanel.setBackground(BGCOLOUR1); 
    centralPanel.setLayout(new GridBagLayout()); 
    centralPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20), 
      BorderFactory.createTitledBorder("Panel"))); 

    JPanel insidePanel = new JPanel(); 
    insidePanel.setOpaque(true); 
    insidePanel.setBackground(BGCOLOUR1); 
    insidePanel.setLayout(new BorderLayout()); 
    insidePanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Inside panel"), 
      BorderFactory.createEmptyBorder(10, 10, 10, 10))); 


    JTextArea insidePanelText = new JTextArea(6, 50); 
    insidePanelText.setLineWrap(true); 

    insidePanel.add(insidePanelText); 

    centralPanel.add(insidePanel, new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTH, 
      GridBagConstraints.HORIZONTAL, new Insets(10, 10, 10, 10), 0, 0)); 

    JScrollPane scrollPane = new JScrollPane(centralPanel); 
    mainFrame.add(scrollPane); 
} 

はなぜ内部のパネルが中央に配置されている発行centralPanel(垂直)私はNORTHへのGridBagConstraintsアンカーを設定すると?私はそれを一番上に置いて欲しい。また

、私はそれはまだ私よりも大きくなっているにもかかわらず、(できるだけ早く私は小さいサイズを変更としてうまく大規模アプリケーションのサイズを変更することができますが、例の通り、私はmainFrameに追加する前にJScrollPanecentralPanelを追加する場合最初にスクロールバーが表示されます)。それをどうやって防ぐことができますか?

編集:スクロールの問題を説明するために(私はこれらの画面取ったとき、私はフレームを編pack):私は、アプリケーションを起動すると

The application when started

はそれが何のスクロールバーを持っていないが

The application when made larger and then smaller again

ウィンドウのサイズを大きくしてから小さくします。それを小さくすると、スクロールバーが表示されます。

+0

'mainFrame.setSize(900,800);の代わりに' pack'を使用します。 – MadProgrammer

+0

いいえ、ウィンドウを内容に合わせたくありません。私はそれを私が指定したサイズにしたい。 – Lieuwe

+0

'pack'はあなたの2番目の問題を解決します – MadProgrammer

答えて

2

GridBagLayoutまでは、提供したプロパティに基づいて、セルのNORTHにレイアウトされています。

GridBagLayoutは、主に構成要素の好ましいサイズに作用し、親コンテナの中心の周りの各構成要素の位置を計算する。代わりの

の場合は、:それは望ましい結果をもたらすだろう

new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.NORTH, 
     GridBagConstraints.HORIZONTAL, new Insets(10, 10, 10, 10), 0, 0) 

new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTH, 
     GridBagConstraints.HORIZONTAL, new Insets(10, 10, 10, 10), 0, 0) 

私のようなものを使用します。

基本的には、gridyを使用して1にそれを設定することで、我々は、このセルに残りのすべての垂直方向のスペースを与えるためにGridBagLayoutを求めているが、我々は、細胞を充填していないので、内容はのNORTHにプッシュされます私は例のように、メインフレームに追加する前に、JScrollPaneの中centralPanelを追加する場合、セル

Vertical position

はまた、私は(できるだけ早く私は小さいサイズを変更としてうまく大規模アプリケーションのサイズを変更することができますが、もともと私が始めたよりもまだ大きいですがスクロールバーが表示されます。それをどうやって防ぐことができますか?

私は本当にこの特定の問題を複製することができませんでした、私はpackまたはsetSizeのいずれかを使用し、その「パック」のサイズとスクロールバーに小さなウィンドウをリサイズ可能性が見えるだろうが、私は "を超えて、ウィンドウをリサイズ後スクロールバーが消えてしまう "packed"サイズの文字列を返します。

+0

ありがとうございます。下のパネルを追加すると、内側のパネルの垂直方向のサイズを変更する必要はありません。なぜなら、元々GridBagLayoutの一番下の行に空の 'ストレッチャー'パネルを追加して解決していたからです「重み付け」要因。これはうまくいくが、これを行うより良い方法があると思った。 – Lieuwe

+0

さて、私はこの場合、通常、「重み」が「1」に設定され、別のコンポーネントを追加するたびにプルダウンされる「フィラー」コンポーネントを持っています。コピーを取得するには['GridBagLayout#getConstraints'](https://docs.oracle.com/javase/8/docs/api/java/awt/GridBagLayout.html#getConstraints-java.awt.Component-)を使用できますコンポーネントの元の制約の中で、それらを更新したら、['GridBagLayout#setConstraints'](https://docs.oracle.com/javase/8/docs/api/java/awt/GridBagLayout)を使用することができます。それらを再適用するためにhtml#setConstraints-java.awt.Component-java.awt.GridBagConstraints-) – MadProgrammer

+0

もちろん、あまりにも多い場合は、SwingLabのSwingXライブラリから[VerticalLayout]を試すことができます。[http: /stackoverflow.com/questions/19148603/resizable-layout-swing-when-disappears-jpanel/19149113#19149113) – MadProgrammer