delete/empty 来自面板的 gridLayout

delete/empty gridLayout from Panel

我有一个 9x9 的网格布局并生成 Jtextareas 来填充它。如果用户按下一个按钮,我希望网格布局再次变空,这样我就可以再次填充它,但与之前填充的内容无关。 有没有像 gridlayout.delete() 之类的命令?

我猜你想清除 GridLayout-using 容器持有的文本组件(你没有告诉我们,请理解这是关于你的问题的关键信息)。如果是这样,将它们放入一个集合中,例如 ArrayList,并在循环中遍历调用 setText("") 的列表。

如果您使用的是 Java 8,则此 "for loop" 可以替换为 Stream 上的 forEach(...) 调用。例如,如果您有一个像这样的 ArrayList:

List<JTextComponent> textComponentList = new ArrayList<>();

然后你可以通过这个调用清除它持有的所有文本组件:

textComponentList.stream().forEach(tc -> tc.setText(""));

例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;
import javax.swing.text.JTextComponent;

@SuppressWarnings("serial")
public class ClearGrid extends JPanel {
    private static final int ROWS = 9;
    private static final int COLS = ROWS;
    private static final int GAP = 2;
    private static final Font FONT = new Font(Font.SANS_SERIF, Font.BOLD, 32);
    private static final int FIELD_COLS = 2;
    List<JTextComponent> textComponentList = new ArrayList<>();

    public ClearGrid() {
        JPanel gridPanel = new JPanel(new GridLayout(ROWS, COLS, GAP, GAP));
        gridPanel.setBackground(Color.BLACK);
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                JTextField textField = new JTextField(FIELD_COLS);
                textField.setFont(FONT);
                textField.setHorizontalAlignment(JTextField.CENTER);
                textComponentList.add(textField);
                gridPanel.add(textField);
            }
        }

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton(new ClearAllAction("Clear All", KeyEvent.VK_C)));

        setLayout(new BorderLayout());
        add(gridPanel);
        add(buttonPanel, BorderLayout.PAGE_END);
    }

    private class ClearAllAction extends AbstractAction {
        public ClearAllAction(String name, int mnemonic) {
            super(name);
            putValue(MNEMONIC_KEY, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            textComponentList.stream().forEach(tc -> tc.setText(""));
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("ClearGrid");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new ClearGrid());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}