1

メソッドを 1 回実行するaddComponents()と、目的の JPanel のレイアウトが得られます。ただし、 のコードaddComponents()が複数回実行されると、JPanel のレイアウトが完全に間違っています。私が間違っていると思われることはありますか?

public class DeleteStudent extends JPanel {

        public SearchPanel search = new SearchPanel();
        private final JButton deleteButton = new JButton("Delete from database");
        private GridBagConstraints cons = new GridBagConstraints();
        private final GridBagLayout gridBag = new GridBagLayout();

        public DeleteStudent() {
        super();
        setLayout(gridBag);
        setPreferredSize(new Dimension(400, 300));

        addComponents();
        addComponents(); //Method fails when run more than once!
        }

        public void addComponents() {
        cons.gridy = 1;
        cons.insets = new Insets(50, 0, 0, 0);
        gridBag.setConstraints(deleteButton, cons);

        removeAll();
        add(search);
        add(deleteButton);
        update();
        }

        private void update() {
        revalidate();
        repaint();
        }

スクリーンショット:

1 つのメソッド呼び出し後の JPanel: http://img402.imageshack.us/img402/6409/oncer.png

2 つのメソッド呼び出し後の JPanel: http://imageshack.us/scaled/landing/254/twiced.png

4

1 に答える 1

3

私のコメントに追加:

問題は、呼び出す前にJPanelsGridBagLayout制約を設定し、removeAll()呼び出し後に行う必要があるremoveAll();ため、新しいコンポーネントを追加したときにLayoutManagerまだ有効であり、デフォルト値にリセットされていないことです。

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Test {

    public Test() {
        createAndShowGui();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new DeleteStudent());
        frame.pack();
        frame.setVisible(true);
    }
}

class DeleteStudent extends JPanel {

    public JPanel search = new JPanel() {//for testing
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    };
    private final JButton deleteButton = new JButton("Delete from database");
    private GridBagConstraints cons = new GridBagConstraints();
    private final GridBagLayout gridBag = new GridBagLayout();

    public DeleteStudent() {
        super();
        setLayout(gridBag);

        addComponents();
        addComponents(); //Method fails when run more than once!
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 300);
    }

    public void addComponents() {
        removeAll();//must call this before resetting Layout and adding new components

        cons.gridy = 1;
        cons.insets = new Insets(50, 0, 0, 0);
        gridBag.setConstraints(deleteButton, cons);

        add(search);
        add(deleteButton);
        update();
    }

    private void update() {
        revalidate();
        repaint();
    }
}
于 2013-01-06T07:47:06.483 に答える