JTextField 的动作侦听器更改另一个文本字段中的值
Action listener for a JTextField to change value in another textfield
我有两个 JTextfield,我希望第二个 Textfield 的 value/text 根据第一个 TextField
中 value/text 的任何变化而变化
这是我正在做的事情
textField_15 = new JTextField("100");
textField_15.setEditable(false);
textField_15.setColumns(10);
textField_15.setBounds(161, 253, 86, 20);
panel_3.add(textField_15);
textField_14 = new JTextField();
textField_14.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int az = Integer.parseInt(textField_14.getText());
int aw = Integer.parseInt(textField_15.getText());
int aq = aw - az;
String ar = String.valueOf((aq));
JOptionPane.showMessageDialog(null, az + " " +aw + " " + aq + " " + ar);
textField_15.setText(ar);
}
});
textField_14.setColumns(10);
textField_14.setBounds(426, 186, 86, 20);
panel_3.add(textField_14);
我假设您不明白 ActionListener
只会在用户按下 Enter 键时收到通知...
这将是最简单的解决方案,但是,如果您想监视对文本组件的更改,则应使用 DocumentListener
有关详细信息,请参阅 How to Use Text Fields, How to Write an Action Listeners and Listening for Changes on a Document
然而,这引发了一些问题。您认为用户何时停止输入?
100
和1
以及0
和0
之间有很大的区别,所以我们需要的是通过某种方式将事件通知延迟到某个时间未来,我们可以“假设”用户已经停止输入(或者至少足够长的时间让我们获取一个合理的值)
public class DeferredDocumentChangedListener implements DocumentListener {
private Timer timer;
private List<ChangeListener> listeners;
public DeferredDocumentChangedListener() {
listeners = new ArrayList<>(25);
timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireStateChanged();
}
});
timer.setRepeats(false);
}
public void addChangeListener(ChangeListener listener) {
listeners.add(listener);
}
public void removeChangeListener(ChangeListener listener) {
listeners.remove(listener);
}
protected void fireStateChanged() {
if (!listeners.isEmpty()) {
ChangeEvent evt = new ChangeEvent(this);
for (ChangeListener listener : listeners) {
listener.stateChanged(evt);
}
}
}
@Override
public void insertUpdate(DocumentEvent e) {
timer.restart();
}
@Override
public void removeUpdate(DocumentEvent e) {
timer.restart();
}
@Override
public void changedUpdate(DocumentEvent e) {
timer.restart();
}
}
好的,所以,这是一个小技巧。这是一个简单的 observable DocumentListener
,它会在未来某个时刻提供文档已更改的事件通知。在你的情况下,你并不真正关心变化,只是它有。
这会设置一个非重复的 Swing Timer
,具有短暂的延迟(示例中为 250 毫秒),如果在该时间段内未重置,将通知任何已注册的 ChangeListener
s .但是,如果 Document
在该时间段内被修改,则 Timer
将被重置。
您可能想尝试一下“超时”值 ;)
然后你可以使用类似...
JTextField number = new JTextField(5);
JTextField sum = new JTextField("0", 5);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(number, gbc);
add(sum, gbc);
DeferredDocumentChangedListener listener = new DeferredDocumentChangedListener();
listener.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int num1 = Integer.parseInt(number.getText());
int num2 = Integer.parseInt(sum.getText());
int result = num1 + num2;
sum.setText(Integer.toString(result));
number.selectAll();
}
});
number.getDocument().addDocumentListener(listener);
这显然不提供任何验证,因此如果文本不是数字,它可能会抛出异常,但我会把它留给你去弄清楚
您可能还想看看 How to Use Spinners and How to Use Formatted Text Fields,它提供了 post 验证过程,可以帮助验证用户输入。
您还可以使用 DocumentFilter
进一步限制用户可以输入的内容,有关详细信息,请参阅 Implementing a Document Filter and DocumentFilter Examples
我有两个 JTextfield,我希望第二个 Textfield 的 value/text 根据第一个 TextField
中 value/text 的任何变化而变化这是我正在做的事情
textField_15 = new JTextField("100");
textField_15.setEditable(false);
textField_15.setColumns(10);
textField_15.setBounds(161, 253, 86, 20);
panel_3.add(textField_15);
textField_14 = new JTextField();
textField_14.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int az = Integer.parseInt(textField_14.getText());
int aw = Integer.parseInt(textField_15.getText());
int aq = aw - az;
String ar = String.valueOf((aq));
JOptionPane.showMessageDialog(null, az + " " +aw + " " + aq + " " + ar);
textField_15.setText(ar);
}
});
textField_14.setColumns(10);
textField_14.setBounds(426, 186, 86, 20);
panel_3.add(textField_14);
我假设您不明白 ActionListener
只会在用户按下 Enter 键时收到通知...
这将是最简单的解决方案,但是,如果您想监视对文本组件的更改,则应使用 DocumentListener
有关详细信息,请参阅 How to Use Text Fields, How to Write an Action Listeners and Listening for Changes on a Document
然而,这引发了一些问题。您认为用户何时停止输入?
100
和1
以及0
和0
之间有很大的区别,所以我们需要的是通过某种方式将事件通知延迟到某个时间未来,我们可以“假设”用户已经停止输入(或者至少足够长的时间让我们获取一个合理的值)
public class DeferredDocumentChangedListener implements DocumentListener {
private Timer timer;
private List<ChangeListener> listeners;
public DeferredDocumentChangedListener() {
listeners = new ArrayList<>(25);
timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireStateChanged();
}
});
timer.setRepeats(false);
}
public void addChangeListener(ChangeListener listener) {
listeners.add(listener);
}
public void removeChangeListener(ChangeListener listener) {
listeners.remove(listener);
}
protected void fireStateChanged() {
if (!listeners.isEmpty()) {
ChangeEvent evt = new ChangeEvent(this);
for (ChangeListener listener : listeners) {
listener.stateChanged(evt);
}
}
}
@Override
public void insertUpdate(DocumentEvent e) {
timer.restart();
}
@Override
public void removeUpdate(DocumentEvent e) {
timer.restart();
}
@Override
public void changedUpdate(DocumentEvent e) {
timer.restart();
}
}
好的,所以,这是一个小技巧。这是一个简单的 observable DocumentListener
,它会在未来某个时刻提供文档已更改的事件通知。在你的情况下,你并不真正关心变化,只是它有。
这会设置一个非重复的 Swing Timer
,具有短暂的延迟(示例中为 250 毫秒),如果在该时间段内未重置,将通知任何已注册的 ChangeListener
s .但是,如果 Document
在该时间段内被修改,则 Timer
将被重置。
您可能想尝试一下“超时”值 ;)
然后你可以使用类似...
JTextField number = new JTextField(5);
JTextField sum = new JTextField("0", 5);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(number, gbc);
add(sum, gbc);
DeferredDocumentChangedListener listener = new DeferredDocumentChangedListener();
listener.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int num1 = Integer.parseInt(number.getText());
int num2 = Integer.parseInt(sum.getText());
int result = num1 + num2;
sum.setText(Integer.toString(result));
number.selectAll();
}
});
number.getDocument().addDocumentListener(listener);
这显然不提供任何验证,因此如果文本不是数字,它可能会抛出异常,但我会把它留给你去弄清楚
您可能还想看看 How to Use Spinners and How to Use Formatted Text Fields,它提供了 post 验证过程,可以帮助验证用户输入。
您还可以使用 DocumentFilter
进一步限制用户可以输入的内容,有关详细信息,请参阅 Implementing a Document Filter and DocumentFilter Examples