计算除数并将字符串输出到 JLabel

Calculating Divisors & Outputting a String to a JLabel

晚上好,

我正在尝试完成一个涉及 JFrame 的简单学校 GUI 项目,但我一直坚持正确返回除数,然后使用 feedback.setText() part.The 指令显示它们如下:

编写 java 代码创建一个 GUI 以接受用户输入的整数,并创建输入值的所有除数。您的框架应包含以下组件:

JLabel:输入一个整数求出它的所有除数

JTextField:读取用户的输入

JButton:启动进程

JLabel:显示输出<----主要问题

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



    public class DivisorException extends JFrame implements ActionListener{

//data fields
final int WIDTH = 300; 
final int HEIGHT = 200;
public String divisors;
private int num;
private JButton find = new JButton("Find"); 
private JLabel question =  new JLabel("Enter a number to find all of its divisors"); 
private JTextField answer = new JTextField(8); 
private JLabel feedback = new JLabel("");


//constructor
public DivisorException(){

    //call super class constructor  --> "Name the Window"
    super("Divisor");

    //set characteristics
    setSize(WIDTH,HEIGHT);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new FlowLayout()); 

    //add components
    add(question); 
    add(answer); 
    answer.addActionListener(this);
    add(find);
    find.addActionListener(this);
    add(feedback);
    }


 @Override
 public void actionPerformed(ActionEvent e){
        try{
            num = Integer.parseInt(answer.getText());
                if(e.getSource().equals(find)){
                feedback.setText("The divisors are: " + divisors);

                }


            }catch(NumberFormatException ex){
                feedback.setText("Invalid input. Enter an integer!");
                answer.setText("");
                }
        }


    private String divisor(int num){

        String divisors = "";
        for(int i = 1; i <= num; i++){
            if(num % i == 0){

                divisors = (i + ", ");          
            }
        }
        return divisors;
    }

}

您有一些问题

  1. 您没有调用 divisor,也没有给任何东西赋值,所以 divisors 总是 null
  2. 您正在隐藏 divisor 中的 divisors 实例字段,因此您分配给它的任何内容都不会反映在
  3. 的其他地方
  4. 您没有将循环的结果附加到 divisors,因此您只会获得最后一个值

首先,我将稍微更改 divisor 以证明我的意思...

private String divisor(int num) {

    StringJoiner sj = new StringJoiner(", ");
    for (int i = 1; i <= num; i++) {
        if (num % i == 0) {
            sj.add(Integer.toString(i));
        }
    }
    return sj.toString();
}

首先,我删除了 divisors 的声明并将其替换为 StringJoiner,它更简单并且提供了更好的结果,但突出了阴影问题。

接下来,我更新了 actionPerformed 方法以实际调用 divisor 方法并将结果分配给 divisors

@Override
public void actionPerformed(ActionEvent e) {
    try {
        num = Integer.parseInt(answer.getText());
        if (e.getSource().equals(find)) {
            divisors = divisor(num);
            feedback.setText("The divisors are: " + divisors);

        }

    } catch (NumberFormatException ex) {
        feedback.setText("Invalid input. Enter an integer!");
        answer.setText("");
    }
}