如何在程序运行时打印在文本字段中输入的文本?
How can I print the text entered in a text field while the program runs?
这是我目前拥有的代码:
public String getLength()
{
return lengthEntry.getText();
}
在另一个 class:
public class Main {
public static void main(String[] args) {
GUI userInterface = new GUI();
System.out.print(userInterface.getLength());
}
}
虽然这只是一个打印语句,所以它只打印文本字段中任何内容的初始值,之后什么也没有。有没有一种方法可以在 main
方法中编写一个循环,当程序为 运行 时,当用户按下回车键时在文本字段中打印值?我知道我可以将 print 语句放在 actionPerformed
方法中,但是如果我不能在另一个 class 中使用对象来调用它并获取 getLength()
方法的意义何在节目中任何时候的相关信息是运行?我只是在寻找伪代码,它不需要编译或任何东西。
在最基本的层面上,您是在事件驱动的环境中操作。也就是说,有些事情发生了,你对此做出了反应。
Swing 利用“观察者模式”允许感兴趣的各方在事情发生时得到通知。这是一个很常见的模式。
在你的情况下,我会“建议”你添加一个 DocumentListener
到 JTextField
的 Document
并且当它发生变化时,你会触发通知给相关方文本计数已更改,例如...
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.EventListener;
import java.util.EventObject;
import javax.swing.JFrame;
import javax.swing.JLabel;
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 Test extends JFrame {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TextPane textPane = new TextPane();
StatusPane statusPane = new StatusPane();
textPane.addTextLengthListener(new TextLengthListener() {
@Override
public void textLengthDidChange(TextLengthEvent event) {
statusPane.setCount(event.getLength());
}
});
JFrame frame = new JFrame();
frame.add(textPane);
frame.add(statusPane, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TextLengthEvent extends EventObject {
private int length;
public TextLengthEvent(Object source, int length) {
super(source);
this.length = length;
}
public int getLength() {
return length;
}
}
public interface TextLengthListener extends EventListener {
public void textLengthDidChange(TextLengthEvent event);
}
public class TextPane extends JPanel {
private JTextField field;
public TextPane() {
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(8, 8, 8, 8));
field = new JTextField(40);
add(field);
field.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
fireTextLengthDidChange();
}
@Override
public void removeUpdate(DocumentEvent e) {
fireTextLengthDidChange();
}
@Override
public void changedUpdate(DocumentEvent e) {
fireTextLengthDidChange();
}
});
}
public JTextField getField() {
return field;
}
public void addTextLengthListener(TextLengthListener listener) {
listenerList.add(TextLengthListener.class, listener);
}
public void removeTextLengthListener(TextLengthListener listener) {
listenerList.remove(TextLengthListener.class, listener);
}
protected void fireTextLengthDidChange() {
TextLengthListener[] listeners = listenerList.getListeners(TextLengthListener.class);
if (listeners.length == 0) {
return;
}
TextLengthEvent evt = new TextLengthEvent(this, getField().getText().length());
for (TextLengthListener listener : listeners) {
listener.textLengthDidChange(evt);
}
}
}
protected class StatusPane extends JPanel {
private JLabel label;
public StatusPane() {
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(8, 8, 8, 8));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.EAST;
gbc.weightx = 1;
label = new JLabel("0");
add(label, gbc);
}
public JLabel getLabel() {
return label;
}
public void setCount(int count) {
getLabel().setText(Integer.toString(count));
}
}
}
这是一个非常基本的示例,它演示了
- 代码解耦
- 职责分离
- 观察者模式(通过Swing中的“监听器”机制实现)
Madprogrammer 发布了一个对每个文档更改做出反应的非常好的示例。
相反,如果您只对用户按下回车键时的字段值(长度)感兴趣,请附加一个 ActionListener。当然,您可以在 ActionListeners 中使用其他对象或 TextField 的内容。
使用ActionEvent.getSource()(继承自EventObject)方法。请注意,如果您已经将 ActionListener 用于其他内容,则为同一事件附加多个侦听器没有问题。
这是我目前拥有的代码:
public String getLength()
{
return lengthEntry.getText();
}
在另一个 class:
public class Main {
public static void main(String[] args) {
GUI userInterface = new GUI();
System.out.print(userInterface.getLength());
}
}
虽然这只是一个打印语句,所以它只打印文本字段中任何内容的初始值,之后什么也没有。有没有一种方法可以在 main
方法中编写一个循环,当程序为 运行 时,当用户按下回车键时在文本字段中打印值?我知道我可以将 print 语句放在 actionPerformed
方法中,但是如果我不能在另一个 class 中使用对象来调用它并获取 getLength()
方法的意义何在节目中任何时候的相关信息是运行?我只是在寻找伪代码,它不需要编译或任何东西。
在最基本的层面上,您是在事件驱动的环境中操作。也就是说,有些事情发生了,你对此做出了反应。
Swing 利用“观察者模式”允许感兴趣的各方在事情发生时得到通知。这是一个很常见的模式。
在你的情况下,我会“建议”你添加一个 DocumentListener
到 JTextField
的 Document
并且当它发生变化时,你会触发通知给相关方文本计数已更改,例如...
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.EventListener;
import java.util.EventObject;
import javax.swing.JFrame;
import javax.swing.JLabel;
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 Test extends JFrame {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TextPane textPane = new TextPane();
StatusPane statusPane = new StatusPane();
textPane.addTextLengthListener(new TextLengthListener() {
@Override
public void textLengthDidChange(TextLengthEvent event) {
statusPane.setCount(event.getLength());
}
});
JFrame frame = new JFrame();
frame.add(textPane);
frame.add(statusPane, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TextLengthEvent extends EventObject {
private int length;
public TextLengthEvent(Object source, int length) {
super(source);
this.length = length;
}
public int getLength() {
return length;
}
}
public interface TextLengthListener extends EventListener {
public void textLengthDidChange(TextLengthEvent event);
}
public class TextPane extends JPanel {
private JTextField field;
public TextPane() {
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(8, 8, 8, 8));
field = new JTextField(40);
add(field);
field.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
fireTextLengthDidChange();
}
@Override
public void removeUpdate(DocumentEvent e) {
fireTextLengthDidChange();
}
@Override
public void changedUpdate(DocumentEvent e) {
fireTextLengthDidChange();
}
});
}
public JTextField getField() {
return field;
}
public void addTextLengthListener(TextLengthListener listener) {
listenerList.add(TextLengthListener.class, listener);
}
public void removeTextLengthListener(TextLengthListener listener) {
listenerList.remove(TextLengthListener.class, listener);
}
protected void fireTextLengthDidChange() {
TextLengthListener[] listeners = listenerList.getListeners(TextLengthListener.class);
if (listeners.length == 0) {
return;
}
TextLengthEvent evt = new TextLengthEvent(this, getField().getText().length());
for (TextLengthListener listener : listeners) {
listener.textLengthDidChange(evt);
}
}
}
protected class StatusPane extends JPanel {
private JLabel label;
public StatusPane() {
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(8, 8, 8, 8));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.EAST;
gbc.weightx = 1;
label = new JLabel("0");
add(label, gbc);
}
public JLabel getLabel() {
return label;
}
public void setCount(int count) {
getLabel().setText(Integer.toString(count));
}
}
}
这是一个非常基本的示例,它演示了
- 代码解耦
- 职责分离
- 观察者模式(通过Swing中的“监听器”机制实现)
Madprogrammer 发布了一个对每个文档更改做出反应的非常好的示例。 相反,如果您只对用户按下回车键时的字段值(长度)感兴趣,请附加一个 ActionListener。当然,您可以在 ActionListeners 中使用其他对象或 TextField 的内容。
使用ActionEvent.getSource()(继承自EventObject)方法。请注意,如果您已经将 ActionListener 用于其他内容,则为同一事件附加多个侦听器没有问题。