java - JTextArea DocumentListener 问题
问题描述
以下代码使用 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));
}}
解决方案
我认为您应该在创建 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));
}}
推荐阅读
- asynchronous - 等待异步函数在 dart 中无法正确执行
- hana - 在哈纳恢复运输
- angular - 不会显示 Maticons
- c++ - nullptr 可以用作类型吗?
- excel - 自定义函数在 VBA 中工作并在 Excel 单元格中调用时返回 #VALUE“错误数据类型”
- javascript - 在 Node.js 中提供发布请求后如何重定向到另一个页面?
- javascript - 如何将条带自定义结帐令牌发布到烧瓶后端
- c# - C# 中的 PictureBox 接受 .PNG 图像?
- mysql - MySQL - DBI:如何判断第一列是否为自增列?
- css - 媒体屏幕 - 使按钮居中