如何访问KeyListener中JTextField对象数组的对象?

How to access the objects of the array of JTextField objects in the KeyListener?

我有这段代码,它使用 JTextField 对象的数组作为 25 个元素,我希望在更改或添加文本后,KeyListener (keyPressed) 将以不同方式处理每个元素。

那么如何才能将更改字段的索引获取到侦听器中?

对于 exist,第 10 个元素将在用户添加或更改文本后将字段背景更改为绿色。

    public JTextField field[];
public void TextFilling(){
    field = new JTextField[25]; Font font = new Font("Times new Roman", Font.BOLD ,30);
    textChangedListener listener = new textChangedListener();

    //There are the process of formating size, location and other settings of the elements:
    for (int i = 0, j=0, k=0; i< field.length; i++, k++) {field[i] = new JTextField();
        if (k==j) field[i].setText("1");
        if (i % 5 == 0 && i!=0) {j++; k = 0;}
        field[i].setBounds(5+(100*(k+1)), 5+(100*(j+1)), 95, 95);
        field[i].setHorizontalAlignment(JTextField.CENTER); field[i].setFont(font);

        frame.add(field[i]);
        field[i].addKeyListener(listener);
    }
}
class textChangedListener implements KeyListener
{
    public void keyPressed(KeyEvent e){
        
    }
    public void keyReleased(KeyEvent e){}

    public void keyTyped(KeyEvent e){}
}

不要在文本组件上使用 KeyListener,这没有用,您可能会陷入状态突变的中间。

相反,使用 DocumentListener 来监视文本字段的更改,有关详细信息,请参阅 How to Write a Document Listener

您还应该使用依赖注入,基本上是将信息传递给需要与您的程序交互的 类。

参见:

了解更多信息。

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private List<JTextField> textFields;

        public TestPane() {
            setBorder(new EmptyBorder(64, 64, 64, 64));
            setLayout(new GridBagLayout());

            Font font = new Font("Times new Roman", Font.BOLD, 30);
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.ipadx = 75;
            gbc.ipady = 75;
            gbc.insets = new Insets(8, 8, 8, 8);
            for (int row = 0; row < 5; row++) {
                for (int col = 0; col < 5; col++) {
                    gbc.gridx = col;
                    gbc.gridy = row;
                    JTextField field = new JTextField(1);
                    field.setHorizontalAlignment(JTextField.CENTER);
                    field.setFont(font);
                    textFields.add(field);

                    if (row == col) {
                        field.setText("1");
                    }

                    int index = ((row * 5) + col) + 1;
                    if (index % 10 == 0) {
                        field.getDocument().addDocumentListener(new DocumentHighlighter(field));
                    }
                    add(field, gbc);
                }
            }
        }

        public class DocumentHighlighter implements DocumentListener {

            private JTextField field;
            private Color defaultColor;

            public DocumentHighlighter(JTextField field) {
                this.field = field;
                defaultColor = field.getBackground();
            }

            protected void highlightFieldIfRequired() {
                if (field.getText().isEmpty()) {
                    field.setBackground(defaultColor);
                } else {
                    field.setBackground(Color.GREEN);
                }
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                highlightFieldIfRequired();
            }

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

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

我能看到的其中一件事是你将要面对的,那就是你如何共享和管理数据。

您想要花一些时间研究的一个概念是您分离责任的方式。可以做到这一点的方法之一是通过“模型”。模型负责管理与数据关联的状态和规则。然后视图负责呈现模型的当前状态并根据用户输入更新模型。

参见:

这个概念的关键要素之一是 observer pattern 的使用。您已经在工作中看到了这一点,因为 Swing 听众是观察者。

哦,您真的非常想花时间学习和理解布局管理器 API。有关详细信息,请参阅 Laying Out Components Within a Container