3

JFrameSwingを使用して Java アプリケーションを構築しようとしていますが、そこに 5 つJTextFieldのインスタンスがあります。これらの 1 つは Sum 用です。

JTextFieldテキスト フィールドに数値を入力するとすぐに、自動的に変更する必要があります。

そんなことがあるものか?

私が書いたものはここにあります。

private void displaytotalActionPerformed(java.awt.event.ActionEvent evt) {
// display total:
Float num1,num2,num3,num4,num5,num6,result;
num1 = display1b.getText().equals("") ? 0 : Float.parseFloat(display1b.getText());
num2 = display2b.getText().equals("") ? 0 : Float.parseFloat(display2b.getText());
num3 = display3b.getText().equals("") ? 0 : Float.parseFloat(display3b.getText());
num4 = display4b.getText().equals("") ? 0 : Float.parseFloat(display4b.getText());
num5 = display5b.getText().equals("") ? 0 : Float.parseFloat(display5b.getText());
num6 = display6b.getText().equals("") ? 0 : Float.parseFloat(display6b.getText());

result = num1+num2+num3+num4+num5+num6;

System.out.println(result);
}

ボタンを使用して合計を取得し、このテキストフィールドに表示しようとしましたが、うまくいきました。しかし、私はそれが自動的に行われることを望んでいます。しかし、上記のコードはテキストフィールドに何も表示しません。

私はこれにかなり慣れていないので、親切にガイドしていただければ幸いです。

4

2 に答える 2

7

探していると思います

  • setText()メソッドJTextField
  • DocumentListener記述して、テキストがいつ変更されたかを認識し、合計を適用する
  • DocumentFilter作成して、数値以外の入力でプログラムがクラッシュしないようにします。

これに代わる方法は、JFormattedTextFieldとリスナーを使用することです。

いくつかの推奨事項。

  • 直感を養ってください。通常、Java クラスのプロパティは によって変更され(get|set)Propertyます。Netbeans のような IDE を使用すると、何かを見つけるのに役立ちます。
  • 自動化は通常、Listener を使用して実現されます。いつ、どれを使用するかを学習するだけです (これも直感の一部です)。
  • 繰り返しコードを書いている場合は、関数の使用を検討してください。すなわち

6回の代わりに:

display1b.getText().equals("") ? 0 : Float.parseFloat(display1b.getText());

フィールドを に配置し、ArrayListそれらを反復する関数を記述し、上記の 1 行ですべての値を設定することを検討してください。

  • ハードコーディングを追加する前に、またはここで質問する前に、 JavaTutorialsに従ってください。あなたにとってより生産的になります。自分で学び、ドキュメントを掘り下げる方法を学ぶからです。
于 2013-01-12T06:39:10.773 に答える
6

DocumentListener各数値フィールドに添付された を使用する必要があります。これにより、フィールドが変更されたときに警告が表示されます。

そこから、何らかのsumメソッドを呼び出して集計を自動的に更新する必要があります。

何かのようなもの...

public class AutoSum {

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

    public AutoSum() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new AutoSumPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class AutoSumPane extends JPanel {

        private JTextField[] fields;
        private JTextField tally;

        public AutoSumPane() {

            fields = new JTextField[5];

            DocumentListener docHandler = new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent e) {
                    autoSum();
                }

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

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

            setLayout(new GridLayout(6, 1));
            for (int index = 0; index < 5; index++) {
                fields[index] = new JTextField(3);
                fields[index].getDocument().addDocumentListener(docHandler);
                fields[index].setHorizontalAlignment(JTextField.RIGHT);
                add(fields[index]);
            }

            tally = new JTextField(3);
            tally.setHorizontalAlignment(JTextField.RIGHT);
            tally.setEditable(false);

            add(tally);

        }

        protected float getValue(JTextField field) {
            float value = 0;
            String text = field.getText();
            if (text != null && text.trim().length() > 0) {
                try {
                    value = Float.parseFloat(text.trim());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return value;
        }

        protected void autoSum() {
            float sum = 0;
            for (JTextField field : fields) {
                sum += getValue(field);
            }
            tally.setText(NumberFormat.getNumberInstance().format(sum));
        }
    }
}

例えば。

詳細については、DocumentListener の記述方法を参照してください。

あなたがそれに取り組んでいる間に、関心のある DocumentFilter の実装を見つけるかもしれません (いくつかの例についてはこれを参照してください)。

于 2013-01-12T06:50:14.357 に答える