【问题标题】:Is it possible to calculate JTextFields into a JLabel as they are being typed? [closed]是否可以在键入 JTextFields 时将它们计算为 JLabel? [关闭]
【发布时间】:2013-08-10 19:24:12
【问题描述】:

是否可以在输入一组 JTextField 时计算它们并将结果设置为 JLabel?

例如:

int iCalc = 0;
JTextField x = new JTextField();
JTextField y = new JTextField();
JTextField z = new JTextField();

JLabel lCalc = new JLabel("Your total is: " + calc);

当我输入时,计算得到计算。我输入 x "12" 并显示 12。 在 y 中,我输入“10”22 会自动输入……等等。

为了“自动”澄清,我不想使用按键侦听器(比如按 Tab 键以获取下一个 TextField)(除非绝对必要)而且我不想点击按钮进行计算

这很像在字符串中输入 Hello World:当我输入标签时,标签将显示:“H”、“e”、“l” 等等,等等。

希望我说得够清楚

【问题讨论】:

  • 是的,计算机完全可以通过编程来做这些事情。
  • 要输入整数,请使用JSpinnerChangeListener 可以调用加法。
  • 当你这样做时,还要确保你没有在EDT 中这样做,我已经可以看到一个“为什么我的GUI 冻结”的问题来了......

标签: java swing jlabel jtextfield


【解决方案1】:

您可以为此使用DocumentListener,将其添加到每个JTextFieldDocument 中,并在DocumentListener 接口的insertUpdate(...) and removeUpdate(...) 方法中执行添加操作。

这是一个工作示例,供进一步了解:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class DocumentListenerExample {

    private JPanel contentPane;
    private JPanel compPanel;
    private JTextField firstField;
    private JTextField secondField;
    private JTextField thirdField;
    private JLabel resultLabel;

    private static final String RESULT = "Result : ";
    private int result;

    private void displayGUI() {
        JFrame frame = new JFrame("Document Listener Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new JPanel(new GridBagLayout());
        compPanel = new JPanel(new BorderLayout(5, 5));

        JPanel fieldPanel = new JPanel(new GridLayout(3, 3, 5, 5));
        JLabel firstLabel = new JLabel("First Number : ", JLabel.CENTER);
        firstField = new JTextField(10);
        firstField.getDocument().addDocumentListener(
                                    new MyDocumentListener());
        JLabel secondLabel = new JLabel("Second Number : ", JLabel.CENTER);
        secondField = new JTextField(10);
        secondField.getDocument().addDocumentListener(
                                    new MyDocumentListener());
        JLabel thirdLabel = new JLabel("Third Number : ", JLabel.CENTER);
        thirdField = new JTextField(10);
        thirdField.getDocument().addDocumentListener(
                                    new MyDocumentListener());
        fieldPanel.add(firstLabel);
        fieldPanel.add(firstField);
        fieldPanel.add(secondLabel);
        fieldPanel.add(secondField);
        fieldPanel.add(thirdLabel);
        fieldPanel.add(thirdField);

        JPanel footerPanel = new JPanel();
        resultLabel = new JLabel((RESULT + "0"), JLabel.CENTER);
        footerPanel.add(resultLabel);

        compPanel.add(fieldPanel, BorderLayout.CENTER);
        compPanel.add(footerPanel, BorderLayout.PAGE_END);
        contentPane.add(compPanel);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private class MyDocumentListener implements DocumentListener {

        @Override
        public void changedUpdate(DocumentEvent de) {}

        @Override
        public void insertUpdate(DocumentEvent de) {
            calculateSum();
        }

        @Override
        public void removeUpdate(DocumentEvent de) {
            calculateSum();
        }

        private void calculateSum() {
            int first = 0, second = 0, third = 0;
            if (firstField.getDocument().getLength() > 0)
                first = Integer.parseInt(firstField.getText()); 
            if (secondField.getDocument().getLength() > 0)
                second = Integer.parseInt(secondField.getText());
            if (thirdField.getDocument().getLength() > 0)
                third = Integer.parseInt(thirdField.getText());
            result = first + second + third;
            resultLabel.setText(RESULT + result);
        }
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new DocumentListenerExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

您可能还必须将 DocumentFilter 添加到 Document 以仅允许将 Digit 放入 JTextField 内,而不是任何随机字符。这是一个相关的example

【讨论】:

  • 不仅在 插入 ... ;-)
  • @kleopatra : 谢谢你指出 :-) 如果用户输入退格键取消更新,我错过了这部分 :(。现在更正 :-)
  • 你不会重复代码,对吧:-)
  • 正是我的意思:-)
  • 这正是我想要的。谢谢!
【解决方案2】:

您需要阅读 java 教程中的监听器并实现一个监听器,它将输入的字符串转换为数字,然后更新标签的文本。

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 2022-11-03
    • 2017-01-03
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多