這是我目前擁有的代碼:
public String getLength()
{
return lengthEntry.getText();
}
在另一堂課中:
public class Main {
public static void main(String[] args) {
GUI userInterface = new GUI();
System.out.print(userInterface.getLength());
}
}
這只是一個列印陳述句,所以它只列印文本欄位中任何內容的初始值,之后什么都不列印。有沒有辦法在main方法中撰寫一個回圈,當程式運行時,當用戶點擊輸入時在文本欄位中列印值?我知道我可以將 print 陳述句放在actionPerformed方法中,但是getLength()如果我不能使用另一個類中的物件來呼叫它并在程式運行時隨時獲取相關資訊,那么該方法的意義何在?我只是在尋找偽代碼,它不需要編譯或任何東西。
uj5u.com熱心網友回復:
在非常基本的層面上,您是在事件驅動的環境中操作。也就是說,有些事情發生了,你就對它做出反應。
Swing 利用“觀察者模式”來允許感興趣的各方在發生某些事情時得到通知。這是一個很常見的模式。
在您的情況下,我會“建議”您將 a 添加DocumentListener到JTextField's 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 中的“偵聽器”機制實作)
uj5u.com熱心網友回復:
Madprogrammer 發布了一個非常好的示例,可以對每個檔案更改做出反應。相反,如果您只對用戶點擊 Enter 時的欄位值(長度)感興趣,請附加一個 ActionListener。當然,您可以在 ActionListeners 中使用其他物件或 TextField 的內容。
使用 ActionEvent.getSource()(繼承自 EventObject)方法。并且請注意,如果您已經將 ActionListener 用于其他內容,則為同一事件附加多個偵聽器沒有問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/336424.html
下一篇:如何以五個數字的行顯示輸出?
