Создание кнопки на калькуляторе, используя цикл for


Как я могу сделать для петли более компактным с помощью функции actionlistener?

package räknare;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import java.awt.event.ActionListener;
import java.awt.Font;
import java.awt.event.ActionEvent;

public class miniräknare {

    static JFrame frame;
    static JTextField textField; 
    static JButton[] nummerButton;      
    static String Inmatning= null;      
    static double talOne;               
    static double talTwo;               
    static double resultat;              
    static String räknesätt;            
    static String svar;
    public static void main(String[] args) {
    Inmatning = new String();   
    nummerButton=new JButton [10];  
    frame=new JFrame("Kalkylatorn");   
    frame.setBounds(100,100,270,450);        
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    frame.getContentPane().setLayout(null);          
    textField= new JTextField();         
    textField.setHorizontalAlignment(SwingConstants.RIGHT);     
    textField.setBounds(10,22,234,62);                              
    frame.getContentPane().add(textField);                      
    textField.setColumns(10);

    for (int i=1 ; i<10 ; i++) {                     
        nummerButton[i]= new JButton(String.valueOf(i));     
        int kolumn =((i-1)%3);                      
        int horisont=((i-1)/3);             
        nummerButton[i].setBounds((10+(kolumn*60)),(220-(horisont*60)),50,50);   
        nummerButton[i].setFont(new Font("Tahoma", Font.BOLD, 20)); 
        frame.getContentPane().add(nummerButton[i]);        
        nummerButton[i].addActionListener(new ActionListener() {            
            public void actionPerformed(ActionEvent e) {                     
                    JButton myButton = (JButton)e.getSource();
                    String Inmatning= textField.getText() + myButton.getText(); 
                                textField.setText(Inmatning);                                   }
        });
    }


552
0
задан 7 апреля 2018 в 11:04 Источник Поделиться
Комментарии
1 ответ

Основы

Занятия в именование Java конвенций должны начинаться с Буквы в верхнем регистре: miniräknare должно быть Miniräknare.

Переменные именование Java конвенций следует начать со строчной буквы: Inmatning должно быть inmatning.

Рефакторинг

Есть несколько вещей в свой код, который может быть переработан, чтобы улучшить читаемость. Функции являются частью этого. Рассмотрим функцию, которая добавляет цифры на дисплее:

private void addDigit(String digit) {
textField.setText(textField.getText() + digit);
}

Эта функция удаляет отображения логики от действий слушателя, и помещает его в miniräknare сам класс.

Еще одна хитрость в Java заключается в том, что интерфейсы с одним методом, как ActionListener это неявно функциональный интерфейс. В данном случаи они должны быть объявлены в функциональном стенографии....

nummerButton[i].addActionListener(e -> addDigit(((JButton)e.getSource()).getText())

Еще одна вещь заключается в том, что шрифт может быть извлечено на постоянной...

private static final Font keyFont = new Font("Tahoma", Font.BOLD, 20);

Код заказа

Я знаю, что это педантичность, но если у вас есть "код установки" и "использовать код", вы должны положить все код настройки, прежде чем вы используете экземпляр, который вы создали.

В вашем случае, у вас есть строка кода:


frame.getContentPane().add(nummerButton[i]);

прежде чем добавить ActionListener для nummerButton[i].

Кроме того, я хотел избежать nummerButton массив целиком, пока кнопка не будет полной....

Результат

    int kolumn =((i-1)%3);                      
int horisont=((i-1)/3);
JButton key = new JButton(String.valueOf(i));
key.setBounds((10+(kolumn*60)),(220-(horisont*60)),50,50);
key.setFont(keyFont);
key.addActionListener(e -> addDigit(((JButton)e.getSource()).getText());

nummerButton[i] = key;
frame.getContentPane().add(key);

Если вы хотите, вы можете поместить весь код создания jbutton С в новой функции тоже, но это может быть слишком много рефакторинга в вашем случае в зависимости от того, сколько других код в ваш метод....

private JButton createKey(int value) {
int kolumn =((value-1)%3);
int horisont=((value-1)/3);
JButton key = new JButton(String.valueOf(value));
key.setBounds((10+(kolumn*60)),(220-(horisont*60)),50,50);
key.setFont(keyFont);
key.addActionListener(e -> addDigit(((JButton)e.getSource()).getText());
return key;
}

и тогда ваш вызывающий код будет:

    nummerButton[i] = createKey(i);
frame.getContentPane().add(nummerButton[i]);

4
ответ дан 7 апреля 2018 в 12:04 Источник Поделиться