如何访问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。
您还应该使用依赖注入,基本上是将信息传递给需要与您的程序交互的 类。
参见:
- Dependency Injection with Code Examples
- What is dependency injection?
- About design patterns: Dependency Injection
- A quick intro to Dependency Injection: what it is, and when to use it
- Dependency Injection
- Passing Information to a Method or a Constructor
了解更多信息。
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();
}
}
}
}
我能看到的其中一件事是你将要面对的,那就是你如何共享和管理数据。
您想要花一些时间研究的一个概念是您分离责任的方式。可以做到这一点的方法之一是通过“模型”。模型负责管理与数据关联的状态和规则。然后视图负责呈现模型的当前状态并根据用户输入更新模型。
参见:
- Model–view–controller
- The Model View Controller Pattern – MVC Architecture and Frameworks Explained
- MVC: Model, View, Controller
这个概念的关键要素之一是 observer pattern 的使用。您已经在工作中看到了这一点,因为 Swing 听众是观察者。
哦,您真的非常想花时间学习和理解布局管理器 API。有关详细信息,请参阅 Laying Out Components Within a Container
我有这段代码,它使用 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。
您还应该使用依赖注入,基本上是将信息传递给需要与您的程序交互的 类。
参见:
- Dependency Injection with Code Examples
- What is dependency injection?
- About design patterns: Dependency Injection
- A quick intro to Dependency Injection: what it is, and when to use it
- Dependency Injection
- Passing Information to a Method or a Constructor
了解更多信息。
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();
}
}
}
}
我能看到的其中一件事是你将要面对的,那就是你如何共享和管理数据。
您想要花一些时间研究的一个概念是您分离责任的方式。可以做到这一点的方法之一是通过“模型”。模型负责管理与数据关联的状态和规则。然后视图负责呈现模型的当前状态并根据用户输入更新模型。
参见:
- Model–view–controller
- The Model View Controller Pattern – MVC Architecture and Frameworks Explained
- MVC: Model, View, Controller
这个概念的关键要素之一是 observer pattern 的使用。您已经在工作中看到了这一点,因为 Swing 听众是观察者。
哦,您真的非常想花时间学习和理解布局管理器 API。有关详细信息,请参阅 Laying Out Components Within a Container