2016-08-18 17 views
0

私はSwingにとってかなり新しいです。私は外部入力に基づいてUIを動的に生成するアプリケーションを持っています。パネルの上部には、見出しテキストを含むJLabelがあり、ボタン(アプリケーションに動的に生成されたものをリロードするよう指示するボタン)があり、その下には動的に生成されたすべてのものが含まれているJScrollPaneがあります。私は、ラベルとボタンが必要なだけ多くの垂直スペースを取るようにし、スクロールペインを残りの利用可能なスペースをすべて埋めるようにします。残りの空き領域をすべて埋めるためにJScrollPaneを取得する方法

GridBagLayoutを使用していて、スクロールペインを追加する前にgbc.fill = BOTHと設定しています。

私はSSCCEをまとめました。最初にロードするとき、ウィンドウはまさに私が望むように見えます。しかし、ウィンドウのサイズを小さくすると、スクロールペインが使用可能なスペースをすべて消費し続け、スクロールバーが表示されることが予想されます。しかし、代わりに、ウィンドウを1ピクセルだけ縮小すると、スクロールペインは小さくなり、内容はほとんど見えなくなります。

私はHow to get a JScrollPane to resize with its parent JPanelを見つけましたが、JScrollPaneが唯一の子ではないときには機能しません。

私は間違っていますか?

SSCCE:私のSSCCEを書きながら

public class SwingTest { 
    public static void main(String[] args) { 
     JPanel bigPanel = new JPanel(); 
     bigPanel.setLayout(new GridLayout(10, 10)); 
     for (int i = 0; i < 100; i++) { 
      bigPanel.add(new JCheckBox("Item " + i)); 
     } 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 

     JFrame mainWindow = new JFrame("Swing Test"); 
     mainWindow.setLayout(new GridBagLayout()); 
     mainWindow.add(new JLabel("Heading"), gbc); 
     mainWindow.add(new JButton("Button"), gbc); 
     gbc.fill = GridBagConstraints.BOTH; 
     mainWindow.add(new JScrollPane(bigPanel), gbc); 

     mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     mainWindow.setLocationByPlatform(true); 
     mainWindow.pack(); 
     mainWindow.setVisible(true); 
    } 
} 

答えて

0

だから、私はこれを考え出しました。 (!それが起こるかおかしい)

は、私がリンクされ、関連する質問に基づいて、私はBorderLayoutのを使用してみました:

public class SwingTest { 
    public static void main(String[] args) { 
     JFrame mainWindow = new JFrame("Swing Test"); 

     mainWindow.setLayout(new BorderLayout()); 
     mainWindow.add(new JLabel("Heading")); 
     mainWindow.add(new JButton("Button")); 
     JPanel bigPanel = new JPanel(); 
     bigPanel.setLayout(new GridLayout(10, 10)); 
     for (int i = 0; i < 100; i++) { 
      bigPanel.add(new JCheckBox("Item " + i)); 
     } 
     mainWindow.add(new JScrollPane(bigPanel)); 

     mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     mainWindow.setLocationByPlatform(true); 
     mainWindow.pack(); 
     mainWindow.setVisible(true); 
    } 
} 

しかし、それは動作しませんでした、私はBorderLayoutのが何をするかの根本的な誤解があったと思うので、 。 add(...)の呼び出しに制約を指定しないことで、3つのコンポーネントすべてを "CENTER"ペインに追加していました。 BorderLayoutの目的は、コンテナのサイズに合わせて1つのコンポーネントを格納することです。固定サイズのままであるエッジの周りに他のものを配置することができます(罫線)。 CENTERに3つすべてを追加することで、最後に追加したものだけが残されました。私はJPanelの中​​で私の見出しとボタンをラップし、上端にそれを置くために必要な:

public class SwingTest { 
    public static void main(String[] args) { 
     JPanel top = new JPanel(); 
     top.setLayout(new BoxLayout(top, BoxLayout.PAGE_AXIS)); 
     top.add(new JLabel("Heading")); 
     top.add(new JButton("Button")); 

     JPanel bigPanel = new JPanel(new GridLayout(10, 10)); 
     for (int i = 0; i < 100; i++) { 
      bigPanel.add(new JCheckBox("Item " + i)); 
     } 

     JFrame mainWindow = new JFrame("Swing Test"); 
     mainWindow.setLayout(new BorderLayout()); 
     mainWindow.add(top, PAGE_START); 
     mainWindow.add(new JScrollPane(bigPanel), CENTER); 

     mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     mainWindow.setLocationByPlatform(true); 
     mainWindow.pack(); 
     mainWindow.setVisible(true); 
    } 
} 

コンポーネントがその後正しく振る舞ったが、ウィンドウにはスクロールは、チェックボックスのグリッドを必要としなかったことを十分に大きく成長したとき、私が望んでいなかったスペースに合わせて拡張しました。私はちょうどそれが左上にピン止めしたいと思った。ここではそれを修正するものです。

public class SwingTest { 
    public static void main(String[] args) { 
     JPanel top = new JPanel(); 
     top.setLayout(new BoxLayout(top, BoxLayout.PAGE_AXIS)); 
     top.add(new JLabel("Heading")); 
     top.add(new JButton("Button")); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.fill = NONE; 
     JPanel bigPanel = new JPanel(new GridBagLayout()); 
     for (int i = 0; i < 10; i++) { 
      gbc.gridx = RELATIVE; 
      gbc.gridy = i; 
      gbc.anchor = NORTHWEST; 
      for (int j = 0; j < 10; j++) { 
       bigPanel.add(new JCheckBox("Item " + (10 * i + j)), gbc); 
      } 
     } 

     // add a panel to the right side to prevent the grid from growing horizontally 
     gbc.fill = BOTH; 
     gbc.weightx = 1; 
     bigPanel.add(new JPanel(), gbc); 

     // add another panel to the bottom to prevent the grid from growing vertically 
     gbc.gridy = RELATIVE; 
     gbc.gridx = 0; 
     gbc.weightx = 0; 
     gbc.weighty = 1; 
     bigPanel.add(new JPanel(), gbc); 

     JFrame mainWindow = new JFrame("Swing Test"); 
     mainWindow.setLayout(new BorderLayout()); 
     mainWindow.add(top, PAGE_START); 
     mainWindow.add(new JScrollPane(bigPanel), CENTER); 

     mainWindow.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     mainWindow.setLocationByPlatform(true); 
     mainWindow.pack(); 
     mainWindow.setVisible(true); 
    } 
} 

なポイント:

  • は常にのBorderLayoutの中心に自分自身でするJScrollPaneを置きます。
  • サイズ変更時にグリッドライクなコンテンツの「セルパディング」を動的に拡大しないようにするには、GridLayoutではなくGridBagLayoutを使用します。
+3

*「私はSSCCEを書いている間にこれを理解しました(面白いやり方!」)。面白いかもしれませんが、それもかなり一般的です。これは、短い例を作ることの(多くの)利点の1つです。それは、大きく見える複雑な問題をコアの問題にまで減らし、問題と解決策の両方を見やすくします。あなたがそれを整理してうれしいです。:) –

+3

JFrameのコンテンツペインのデフォルトのレイアウトはBorderLayoutなので、 'mainWindow.setLayout(new BorderLayout());ステートメントの必要はありません; – FredK

+0

@AndrewThompson"どうしたらいいのですか? "そのことを指摘することを意図していました。私は単に投稿しないことについて議論しましたが、それを理解するまでにはかなり時間がかかりましたので、私は働かせないようにして、私のSSCCEは無駄になりました。 :) – JakeRobb

関連する問題