ActionListener问题:查看数字是否为素数的程序?(JavaGUI)

ActionListener问题:查看数字是否为素数的程序?(JavaGUI),java,swing,actionlistener,Java,Swing,Actionlistener,因此,我认为这段代码的问题在于ActionListner。运行程序时,我输入一个数字,但什么也没发生。只有当我输入数字2时,程序才能正常运行。很明显,我在for循环中做了一些错误的事情,但我还没有弄清楚 import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.text.*; public class Prime implements ActionListener { JFrame fra

因此,我认为这段代码的问题在于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();
    }
}
import java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;
导入java.text.*;
公共类Prime实现ActionListener{
JFrame-framePrime;
JPanel panelPrime;
JTextField-primeTestField;
JLabel stringPrimelLabel、enterNumLabel、trueFalseLabel;
//建造师
公共素数(){
//创建框架和容器。
framePrime=newjframe(“Prime还是Not?”);
panelPrime=新的JPanel();
设置布局(新的网格布局(2,2));
//添加小部件。
addWidgets();
//将面板添加到框架中。
framePrime.getContentPane().add(panelPrime,BorderLayout.CENTER);
//当窗口关闭时退出。
framePrime.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示转换器。
framePrime.pack();
framePrime.setVisible(true);
}
//创建并添加转换器的小部件。
私有void addWidgets(){
//创建小部件。
primeTestField=新的JTextField();
primeTestField.setHorizontalAlignment(JTextField.CENTER);
enterNumLabel=newjlabel(“输入一个数字:”,
SwingConstants.左);
stringPrimelLabel=new JLabel(“它是质数吗?:”,
SwingConstants.左);
trueFalseLabel=new JLabel(“让我们来看看吧!”,
SwingConstants.中心);
//侦听Convert textfield中的事件。
primeTestField.addActionListener(此);
//将小部件添加到容器中。
panelPrime.add(enterNumLabel);
panelPrime.add(primeTestField);
panelPrime.add(stringPrimelLabel);
panelPrime.add(trueFalseLabel);
镶板底面(颜色:红色);
}
//ActionListener接口的实现。
已执行的公共无效操作(操作事件){
int n=Integer.parseInt(primeTestField.getText());
如果(n==2){
trueFalseLabel.setText(“是”);
}
否则{
对于(int i=2;2*i当您在文本字段中按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) {
        }
    });
(附言:我纠正了你的基本检查逻辑,并将其重构为一个方法,使其正确且可重用)

private void check(){
int n;
试一试{
System.out.println(primeTestField.getText());
n=Integer.parseInt(primeTestField.getText());
}捕获(例外情况除外){
返回;
}
如果(n==2){
trueFalseLabel.setText(“是”);
}否则{
布尔值isPrime=true;
对于(int i=2;2*i
你按下[enter]键了吗(当primeTestField有焦点时)?Whery奇怪且错误的确定质数的方法如上所述,这是错误的方法,但是从你的代码来看,我认为你的问题是这一行:
for(int I=2;2*I
。如果你输入3,2*I(4)永远不会<3,那么你的循环就不会继续了。“我建议您在文本字段中添加一个keyListener并覆盖keyReleased方法:”-我强烈建议您不要(也不建议在Swing中使用
keyListener
,但特别是不要用于文本组件),如果您“真的”想知道字段何时更新,请改用
DocumentListener
(请参阅),但是一个按钮是一个更简单的解决方案。所以,我给你一个+1作为第一句话,给你一个-1作为
KeyListener
谢谢你们的帮助,我能够使用一个按钮制作程序,但仍然使用textfield的方式,这样我就可以了解更多关于DocumentListner的信息。
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");
        }
    }
}