java - 将带有 TextField 的 Java 程序转换为 swing JTextField

标签 java swing awt

这段代码是我将转换为 swing 的程序的简化版本(使用 JTextFieldDocumentListener)。我读过一些教程,但我做不到...... 我不应该使用全局变量,我必须使用诸如 getSource() 之类的变量(在这种情况下是 getDocument() ?),因为在原始程序中 JTextField 的数量是变量(它们是在 for 内生成的,因此它们没有“名称”)。该数字取决于文本文件中写入的值。

import java.awt.*;
import java.awt.event.*;

class TestWindow extends Frame {
    public TestWindow() {
        Panel p = new Panel(new FlowLayout());
        Label l = new Label("Temp");
        TextField tf1 = new TextField();
        TextField tf2 = new TextField();
        tf1.addTextListener(new myTextListener(l));
        tf2.addTextListener(new myTextListener(l));
        p.add(tf1);
        p.add(tf2);
        tf1.setColumns(10);
        tf2.setColumns(10);
        p.add(l);
        add(p);
        pack();
        setVisible(true);
    }

    class myTextListener implements TextListener {
        Label input;
        myTextListener(Label input) {
            this.input = input;
        }
        public void textValueChanged(TextEvent e) {
            input.setText(((TextField)(e.getSource())).getText());
        }
    }

}

public class Test {

    public static void main(String[] args) {
        new TestWindow();
    }

}

最佳答案

这是您发布到 Swing 的代码的直接转换,执行完全相同的任务:

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import java.awt.FlowLayout;

public class TestWindow extends JFrame {

public TestWindow() {
    JPanel p = new JPanel(new FlowLayout());
    JLabel l = new JLabel("Temp");
    JTextField tf1 = new JTextField(10);
    JTextField tf2 = new JTextField(10);
    tf1.getDocument().addDocumentListener(new MyDocumentListener(l));
    tf2.getDocument().addDocumentListener(new MyDocumentListener(l));
    p.add(tf1);
    p.add(tf2);
    p.add(l);
    add(p);
    pack();
    setVisible(true);
}

class MyDocumentListener implements DocumentListener{

    private JLabel label;

    MyDocumentListener(JLabel label) {
        this.label = label;
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        handleTextChange(e);
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        handleTextChange(e);
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        handleTextChange(e);
    }

    private void handleTextChange(DocumentEvent e) {
        try {
            label.setText(e.getDocument().getText(0,e.getDocument().getLength()));
        } catch (BadLocationException ignored) {
            //todo: handle exception properly although this should never happen
        }
    }
}

public static void main(String[] args) {
    new TestWindow();
}

}

请注意,与 TextListener 相比,DocumentListener 提供了更多用于处理文本更改事件的控制,但我选择使用一种方法来处理它们,以便与示例的功能完全匹配

关于java - 将带有 TextField 的 Java 程序转换为 swing JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11013543/

相关文章:

java - 将 JSeparator 添加到 DefaultListModel

java - 一起使用 swing 和 awt 是不好的做法吗?

class - 在哪里可以找到标准 Java 类的代码?

java - 从语义上理解递归反向字符串返回语句

java - BasicClientConnManager 使用无效 : connection still allocated

java.lang.IllegalStateException : ViewPager 错误

java - JMenu 子菜单小箭头图标指示器

java - 不可序列化异常 - 组布局

java - 在 JTextPane 中禁用超链接

java - 寻找包含 JuiCEProviderOpenSSL 的 jar 文件