TextField не работает должным образом.Джава - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь построить базовый калькулятор.Я хочу, чтобы этот textField работал в качестве калькулятора (нажмите, например, 154 и отобразите 154), когда я нажимаю кнопки с номерами.К сожалению, я не получаю должного результата.Например, когда я нажимаю 9, я получаю 0123456789. Я не знаю, как передать кнопку int в массив и массив, а затем извлечь в виде строки.

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

public class Buttons {
    public static List<JButton> generateButtons(JFrame frame) {
    List<JButton> buttons = new ArrayList<>();
    int x = 20;
    int y = 500;
    for (int i = 0; i < 10; i++) {
        String str = Integer.toString(i);
        buttons.add(new JButton(str));
        buttons.get(i).setBounds(x, y, 50, 50);
        x += 60;
        frame.add(buttons.get(i));
        if (x >= 380) {
            x = 20;
            y = 430;
        }
    }
    return buttons;
}
    public static String displayOnTextField(List<JButton> list,JTextField field){
        int number = 0;
        String str = "";
        for (int i = 0; i <list.size(); i++){
            String returned = Integer.toString(i);
            str += returned;
            String finalStr = str;
            list.get(i).addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    field.setText(finalStr);
                }
            });
        }
        return str;
    }
}

И main:

import javax.swing.*;
import java.util.List;

public class main {
    public static void main(String[] args) {
    JFrame frame = new JFrame();
    JTextField textField = new JTextField();

    List<JButton> list =  Buttons.generateButtons(frame);
    String displayOnTextField = Buttons.displayOnTextField(list,textField);


    frame.setSize(400,600);
    textField.setBounds(150,40,150,30);
    frame.add(textField);
    frame.setLayout(null);
    frame.setVisible(true);

    }
}

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Поскольку вы добавляете строку в цикл, который вы получаете от кнопки, хранящейся в списке, как показано ниже

            String returned = Integer.toString(i);
            str += returned;
            String finalStr = str;

, поэтому для кнопки 0 конечная строка будет 0 для кнопки 1конечная строка будет 01 и т. д.

, вместо этого вы можете сделать следующее: Измените ваше finalStr назначение строк на

String finalStr =  Integer.toString(i);

и в actionPerformed метод устанавливает текст следующим образом

field.setText(field.getText() + finalStr);

Это будет работать для вас ...

0 голосов
/ 07 июня 2018

Добавляемая строка: finalStr, которую вы строите в цикле.

    String returned = Integer.toString(i);
    str += returned;
    String finalStr = str;

Если вы не хотите, чтобы она добавляла предшествующие символы, не используйте +=.Вы можете просто использовать:

    String finalStr = Integer.toString(i);
...