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添加组件时删除组件时调整,但不是?
答
你必须重新验证并重新绘制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
如果你打电话重新验证并重新绘制由JScrollPane中举行的JViewport会发生什么? –
如果您将您的[SSCCE](http://sscce.org)与您的问题一起显示问题,您通常会更快得到更好的答案。 – camickr
感谢气垫船,它做到了。错过'重新验证'。 – naugler