如何在程序运行时打印在文本字段中输入的文本?

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 利用“观察者模式”允许感兴趣的各方在事情发生时得到通知。这是一个很常见的模式。

在你的情况下,我会“建议”你添加一个 DocumentListenerJTextFieldDocument 并且当它发生变化时,你会触发通知给相关方文本计数已更改,例如...

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 用于其他内容,则为同一事件附加多个侦听器没有问题。