JScrollPane中的GridBagLayout没有正确调整大小

问题描述:

我在JScrollPane中有一个带有GridBagLayout的JPanel。我还在JPanel中有一个'add'按钮,单击它时将从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添加组件时删除组件时调整,但不是?

+1

如果你打电话重新验证并重新绘制由JScrollPane中举行的JViewport会发生什么? –

+1

如果您将您的[SSCCE](http://sscce.org)与您的问题一起显示问题,您通常会更快得到更好的答案。 – camickr

+0

感谢气垫船,它做到了。错过'重新验证'。 – naugler

你必须重新验证并重新绘制JScrollPane的,这里有一个例子:

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

谢谢!我错过了'重新验证'的方法,并使用'验证'。 – naugler