0

JScrollPane 内に GridBagLayout を持つ JPanel があります。また、JPanel 内に「追加」ボタンがあり、クリックすると JPanel から削除され、別のコンポーネントの新しいインスタンスが JPanel に追加され、それ自体が JPanel に追加されます。この種のコンポーネントのリストが増え、その後に「追加」ボタンが続きます。

新しいコンポーネントの追加は正常に機能し、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 のサイズが変更されるのに、コンポーネントを削除するときに変更されないのはなぜですか?

4

1 に答える 1

1

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);
    }
}
于 2011-07-29T12:05:38.347 に答える