簡體   English   中英

ActionListener 問題:程序查看一個數是否為素數? (Java 圖形用戶界面)

[英]ActionListener Issue: Program to see if a number is prime or not? (Java GUI)

所以我認為這段代碼的問題出在 ActionListner 中。 運行程序時,我輸入了一個數字,但沒有任何反應。 程序將正確運行的唯一數字是當我輸入數字 2 時。我顯然在 for 循環中做錯了什么,但我還沒有弄清楚。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.text.*;

public class Prime implements ActionListener {
    JFrame framePrime;

    JPanel panelPrime;

    JTextField primeTestField;

    JLabel stringPrimelLabel, enterNumLabel, trueFalseLabel;

    // Constructor
    public Prime() {
        // Create the frame and container.
        framePrime = new JFrame("Prime or Not?");
        panelPrime = new JPanel();
        panelPrime.setLayout(new GridLayout(2, 2));


    // Add the widgets.
    addWidgets();

    // Add the panel to the frame.
    framePrime.getContentPane().add(panelPrime, BorderLayout.CENTER);

    // Exit when the window is closed.
    framePrime.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Show the converter.
    framePrime.pack();
    framePrime.setVisible(true);
    }

    // Create and add the widgets for converter.
    private void addWidgets() {

        // Create widgets.
        primeTestField = new JTextField();
        primeTestField.setHorizontalAlignment(JTextField.CENTER);
        enterNumLabel = new JLabel("Enter a number:            ",          
                                             SwingConstants.LEFT);
        stringPrimelLabel = new JLabel("Is it Prime?:  ", 
                                             SwingConstants.LEFT);
        trueFalseLabel = new JLabel("Let's Find Out!",
                                           SwingConstants.CENTER);

        // Listen to events from Convert textfield.
        primeTestField.addActionListener(this);

        // Add widgets to container.
        panelPrime.add(enterNumLabel);
        panelPrime.add(primeTestField);
        panelPrime.add(stringPrimelLabel);
        panelPrime.add(trueFalseLabel);

        panelPrime.setBackground(Color.red);
    }

    // Implementation of ActionListener interface.
    public void actionPerformed(ActionEvent event) {

        int n = Integer.parseInt(primeTestField.getText());

        if (n == 2) {
            trueFalseLabel.setText("Yes");
        }
        else {
             for (int i = 2; 2*i < n; i++) {
                if(n % i == 0){
                     trueFalseLabel.setText("No");
                }
                else {
                     trueFalseLabel.setText("Yes");
                }
            }
        }
    }

    // main method
    public static void main(String[] args) {
    Prime converter = new Prime();
    }
}

當您在文本字段中按 Enter 鍵時,會觸發 JTextField 的ActionListener

編輯:如果您想在文本字段中更改值時進行主要檢查。 正如@MadProgrammer 所建議的,您可以在文本字段的文檔中添加一個DocumentListener並實現insertUpdate (添加字符時調用)和removeUpdate (刪除字符時調用)方法。

primeTestField.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent e) 
            check();
        }

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

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

(PS:我將您的主要檢查邏輯更正並重構為一種方法,使其正確且可重用)

private void check() {
    int n;
    try {
        System.out.println(primeTestField.getText());
        n = Integer.parseInt(primeTestField.getText());
    } catch (Exception ex) {
        return;
    }
    if (n == 2) {
        trueFalseLabel.setText("Yes");
    } else {
        boolean isPrime = true;
        for (int i = 2; 2 * i < n; i++) {
            if (n % i == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            trueFalseLabel.setText("Yes");
        } else {
            trueFalseLabel.setText("No");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM