3

行を GridBagLayout に追加するコードがありますが、行を削除する方法がわかりません。特定のボタンがクリックされたときにレイアウトの最後の行を取り除きたい。

これはそれらを追加するコードです:

public static JPanel createLayout(int rows) {
    JPanel product = new JPanel(new GridBagLayout());
    String[] lables = {"School    ", "Advanced #", "Novice #   "};
    double weight = .3333333333333;

    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(3, 3, 3, 3);
    c.weightx = weight;
    c.fill = GridBagConstraints.HORIZONTAL;
    c.anchor = GridBagConstraints.CENTER;
    c.gridy = 1;
    for (int j = 0; j < lables.length; j++) {
        c.gridx = j;
        JLabel l = new JLabel(lables[j]);
        product.add(l, c);
    }

    for (int i = 0; i < rows; i++) {
        c.gridy++;
        for (int j = 0; j < lables.length; j++) {
            c.gridx = j;
            JTextField f = new JTextField();
            product.add(f, c);
        }
    }
    c.gridy++;
    c.gridx = 0;
    c.anchor = GridBagConstraints.NORTHWEST;
    c.fill = GridBagConstraints.NONE;

    JPanel b = new JPanel();
    JButton add = new JButton("+");
    b.add(add);
    JButton delete = new JButton("-");
    b.add(delete);
    product.add(b, c);
    return product;
}
public static void main(String[] args) throws IOException {
    JFrame frame = new JFrame("Debate Calculator");
    JPanel debates = new JPanel();
    frame.add(createLayout(5), BorderLayout.NORTH);
    frame.pack();
    frame.setVisible(true);
}

では、行を削除するにはどうすればよいでしょうか。

4

1 に答える 1

3

すべてを自分で行うことに固執する場合は、何らかのモデルを維持して、すべてがどこにあるかを把握する必要があります。

コンポーネントの各行を何らかの種類の に追加することから始めListます。行を削除すると、その行を構成するすべてのコンポーネントを見つけて、コンテナーから削除することができます。

これにより、問題が発生します。y最後の行の位置が行数と一致しなくなる可能性があるためです。c.gridy = listOfComponents.size()(つまり、次の行を追加する場所を単純に決定することはできません)。

GridBagConstraintsただし、特定のコンポーネントのレイアウトに使用される制約を取得することはできます。これは、 の最後の行を見つけて、最初の列の制約を取得し、最後の位置listを推測できることを意味します...詳細については、 をご覧ください。yGridBagConstraints#getConstraints

または、単に使用することもできますJTable

于 2013-04-28T23:39:07.953 に答える