ActionListener问题:查看数字是否为素数的程序?(JavaGUI)
因此,我认为这段代码的问题在于ActionListner。运行程序时,我输入一个数字,但什么也没发生。只有当我输入数字2时,程序才能正常运行。很明显,我在for循环中做了一些错误的事情,但我还没有弄清楚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
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");
}
}
}