首页 > 解决方案 > JTextArea DocumentListener 问题

问题描述

jTextAreaName 的验证

以下代码使用 GridBagconstraints 创建一些 jTextAreaName。我的问题是我尝试使用 DocumentListener 验证 jTextAreaName 中的文本。但是它只验证最后一个 jTextAreaName。不是全部(见上图)。我认为这取决于 GridBagConstraints。但我不知道如何解决这个问题。

你有什么提示我应该改变什么?

提前致谢。

public class GridPanel extends JPanel {

private String[] COLUMNS = {"Name", "Frame 1", "Frame 2", "Frame 3", "Frame 4", "Frame 5",
        "Frame 6", "Frame 7", "Frame 8", "Frame 9", "Frame 10", "Total Sum"};

private JTextArea jTextAreaName;
public JTextArea jTextAreaTotalSum;
private JLabel labelName;
private JLabel labelFrame;
private JLabel labelSum;
private static String pattern = "[A-Za-z]*";
public static List<JTextArea> jTextAreas = new ArrayList<>();

public GridPanel(int numPlayers) {
    setLayout(new BorderLayout());
    createGrid(numPlayers);
}


public void createGrid(int numPlayers) {

    setLayout(new GridBagLayout());

    for (int y = 1; y <= numPlayers; y++) {

        createHeader();

        jTextAreaName = new JTextArea(2, 8);
        jTextAreaName.setEditable(true);
        addDocumentListener(jTextAreaName);

        add(jTextAreaName, GridBag.constraints(0, y, 1, 1));

        for (int i = 1; i <= 9; i++) {
            add(new BowlingFramePanel(2), GridBag.constraints(i, y, 1, 1));
        }
        add(new BowlingFramePanel(3), GridBag.constraints(10, y, 1, 1));

        jTextAreaTotalSum = new JTextArea(2, 8);
        jTextAreaTotalSum.setEditable(false);

        add(jTextAreaTotalSum, GridBag.constraints(11, y, 1, 1));
    }

}

private void addDocumentListener(JTextArea jTextArea) {
    jTextArea.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent e) {
            validateInputName();
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            validateInputName();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            validateInputName();
        }
    });
}

private void validateInputName() {

    jTextAreas.add(jTextAreaName);

    for (JTextArea jTextArea : jTextAreas) {

        String text = jTextArea.getText();
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(text);

        if (m.matches()) {
            jTextArea.setBackground(Color.GREEN);
            ifTextAreaIsEmptySetBackgroundColorWhite(jTextArea, text);
        } else {
            jTextArea.setBackground(Color.RED);
            ifTextAreaIsEmptySetBackgroundColorWhite(jTextArea, text);
        }
    }
}

private void ifTextAreaIsEmptySetBackgroundColorWhite(JTextArea jTextArea, String text) {
    if (text.isEmpty()) {
        jTextArea.setBackground(Color.WHITE);
    }
}

private void createHeader() {
    labelName = new JLabel(COLUMNS[0]);
    labelName.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));

    add(labelName, GridBag.constraints(0, 0, 1, 1));

    for (int x = 1; x <= 10; x++) {

        labelFrame = new JLabel(" " + "Frame " + Integer.toString(x));
        labelFrame.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));

        add(labelFrame, GridBag.constraints(x, 0, 1, 1));
    }

    labelSum = new JLabel(" " + COLUMNS[11]);
    labelSum.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
    add(labelSum, GridBag.constraints(11, 0, 1, 1));


}}

标签: javaswingjtextareadocumentlistener

解决方案


我认为您应该在创建 JTexteAreas 后将它们直接添加到 List 中。不在 DocumentListener 中:

public class GridPanel extends JPanel {

private String[] COLUMNS = {"Name", "Frame 1", "Frame 2", "Frame 3", "Frame 4", "Frame 5",
        "Frame 6", "Frame 7", "Frame 8", "Frame 9", "Frame 10", "Total Sum"};

private JTextArea jTextAreaName;
public JTextArea jTextAreaTotalSum;
private JLabel labelName;
private JLabel labelFrame;
private JLabel labelSum;
private static String pattern = "[A-Za-z]*";
public static List<JTextArea> jTextAreas = new ArrayList<>();

public GridPanel(int numPlayers) {
    setLayout(new BorderLayout());
    createGrid(numPlayers);
}


public void createGrid(int numPlayers) {

    setLayout(new GridBagLayout());

    for (int y = 1; y <= numPlayers; y++) {

        createHeader();

        jTextAreaName = new JTextArea(2, 8);
        jTextAreaName.setEditable(true);
        addDocumentListener(jTextAreaName);

        add(jTextAreaName, GridBag.constraints(0, y, 1, 1));

        for (int i = 1; i <= 9; i++) {
            add(new BowlingFramePanel(2), GridBag.constraints(i, y, 1, 1));
        }
        add(new BowlingFramePanel(3), GridBag.constraints(10, y, 1, 1));

        jTextAreaTotalSum = new JTextArea(2, 8);
        jTextAreaTotalSum.setEditable(false);

        add(jTextAreaTotalSum, GridBag.constraints(11, y, 1, 1));
        jTextAreas.add(jTextAreaName);
    }

}

private void addDocumentListener(JTextArea jTextArea) {
    jTextArea.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent e) {
            validateInputName();
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            validateInputName();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            validateInputName();
        }
    });
}

private void validateInputName() {
    for (JTextArea jTextArea : jTextAreas) {

        String text = jTextArea.getText();
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(text);

        if (m.matches()) {
            jTextArea.setBackground(Color.GREEN);
            ifTextAreaIsEmptySetBackgroundColorWhite(jTextArea, text);
        } else {
            jTextArea.setBackground(Color.RED);
            ifTextAreaIsEmptySetBackgroundColorWhite(jTextArea, text);
        }
    }
}

private void ifTextAreaIsEmptySetBackgroundColorWhite(JTextArea jTextArea, String text) {
    if (text.isEmpty()) {
        jTextArea.setBackground(Color.WHITE);
    }
}

private void createHeader() {
    labelName = new JLabel(COLUMNS[0]);
    labelName.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));

    add(labelName, GridBag.constraints(0, 0, 1, 1));

    for (int x = 1; x <= 10; x++) {

        labelFrame = new JLabel(" " + "Frame " + Integer.toString(x));
        labelFrame.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));

        add(labelFrame, GridBag.constraints(x, 0, 1, 1));
    }

    labelSum = new JLabel(" " + COLUMNS[11]);
    labelSum.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
    add(labelSum, GridBag.constraints(11, 0, 1, 1));


}}

推荐阅读