[英]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.