2011-07-28 30 views
0

JScrollPaneの内部にGridBagLayoutを持つJPanelがあります。また、JPanel内に「追加」ボタンがあり、これをクリックするとJPanelから削除され、別のコンポーネントの新しいインスタンスがJPanelに追加され、JPanelに追加されます。この種のコンポーネントでは、コンポーネントのリストが増加し、その後に「追加」ボタンが追加されます。JScrollPane内のGridBagLayoutが正しくサイズ変更されない

新しいコンポーネントを追加すると、JPanelは新しいコンポーネントに対応するように伸び、JScrollPaneは期待どおりに動作し、JPanelの全長をスクロールできます。

これは、アドオンがどのように働くかある:

jPanel.remove(addButton); 
GridBagConstraints c = new GridBagConstraints(); 
c.gridx = 0; 
c.gridy = GridBagConstraints.RELATIVE; 
jPanel.add(new MyComponent(), c); 
jPanel.add(addButton, c); 
jPanel.validate(); 
jPanel.repaint();` 

除去が追加されたコンポーネント自身の内側のボタンをクリックすることで動作します。彼らはちょうど良いJPanelから自分自身を削除します。しかし、JPanelは、コンポーネントのリストを再センタリングして、伸ばしたサイズを保持します。

Container parent = myComponent.getParent(); 
parent.remove(myComponent); 
parent.validate(); 
parent.repaint();` 

質問は、コンポーネントを削除するとき、なぜ私のGridBagLayoutのJPanelのは、コンポーネントを追加するときにサイズを変更しませんが、次のとおりです。

これは除去がどのように働くかありますか?あなたがするJScrollPaneを再検証し、再描画する必要が

+1

はどうなりますか? –

+1

[SSCCE](http://sscce.org)に問題を示す質問を投稿すると、より良い回答が早く得られます。 – camickr

+0

ホバークラフトに感謝しました。逃した 'revalidate'。 – naugler

答えて

1

は、ここでの例です:あなたが再検証し、JScrollPaneのが保有するJViewportに再描画を呼び出す場合

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

public class SwingTest { 

    public static void main(String[] args) { 
     final JPanel panel = new JPanel(new GridBagLayout()); 

     for (int i = 0; i < 25; i++) { 
      JTextField field = new JTextField("Field " + i, 20); 

      GridBagConstraints constraints = new GridBagConstraints(); 
      constraints.gridy = i; 

      panel.add(field, constraints); 
     } 

     final JScrollPane scrollPane = new JScrollPane(panel); 

     JButton removeButton = new JButton("Remove Field"); 
     removeButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (panel.getComponentCount() >= 1) { 
        panel.remove(panel.getComponentCount() - 1); 
        scrollPane.revalidate(); 
        scrollPane.repaint(); 
       } 
      } 
     }); 


     JFrame frame = new JFrame("Swing Test"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setSize(640, 480); 
     frame.setLocation(200, 200); 
     frame.getContentPane().add(scrollPane); 
     frame.getContentPane().add(removeButton, BorderLayout.SOUTH); 

     frame.setVisible(true); 
    } 
} 
+0

ありがとう!私は 'revalidate'メソッドを見逃して、 'validate'を使っていました。 – naugler

関連する問題