Многие кнопки выполняют похожие задачи - есть ли способ упростить действие выполненного? - PullRequest
2 голосов
/ 17 января 2012

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

В настоящее время их действия изложены так:

...
svwnb.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = svwnb.getText();
            dftframe.setVisible(false);
        }
    });
    blypb.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = blypb.getText();
            dftframe.setVisible(false);
        }
    });
    pw91b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = pw91b.getText();
            dftframe.setVisible(false);
        }
    });
    b97db.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = b97db.getText();
            dftframe.setVisible(false);
        }
    });
    pbepbesolb.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = pbepbesolb.getText();
            dftframe.setVisible(false);
        }
    });
...

Есть ли способ упростить это до простого метода? У меня есть ощущение, что мне нужно использовать метод getSource(), но у меня нет опыта в создании метода действия, подобного этому.

Чтобы быть более кратким, у меня есть идея, что код будет выглядеть примерно как следующий псевдокод:

 public void actionPerformed(ActionEvent e){
     input[5] = e.getSource().getText();
     dftframe.setVisible(false);
 }

Я просто не знаю точно, как сгенерировать этот код.

Ответы [ 3 ]

2 голосов
/ 17 января 2012

Вы можете определить ActionListener следующим образом:

ActionListener commonListener = new ActionListener() {

    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        if (o instanceof JTextField) {
            JTextField textField = (JTextField)o;
            input[5] = textField.getText();
            textField.setVisible(true);
        }
    }
};

И использовать его, добавив его к каждому компоненту:

svnwnb.addActionListener(commonListener);
...
1 голос
/ 17 января 2012

У вас есть дополнительный e в вашем псевдокоде, иначе все должно работать нормально.

input[5] = e.getSource().e.getText(); 
                         ^

Это должно быть

input[5] = e.getSource().getText();

Возможно, вам понадобится дополнительный привод к e.getSource () что-то вроде (Не уверен, требуется ли он или нет)

input[5] = ((JButton)e.getSource()).getText();

В ActionEvent также есть метод getActionCommand, который вы можете использовать, но он будет работать, только если в ваших кнопках установлен правильный actionCommand.

0 голосов
/ 17 января 2012

Оглядываясь на исходный объект, действительно грязно. Кроме того, источник часто бывает неожиданным или недокументированным. Просто используйте разные экземпляры слушателя для каждой кнопки:

    addTextAction(svwnb);
    addTextAction(blypb);
    addTextAction(pw91b);
    addTextAction(b97db);
    addTextAction(pbepbesolb);
    ...

private void addTextAction(final AbstractButton button) {
    button.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            input[5] = button.getText();
            dftframe.setVisible(false);
        }
    });
}

(Связывание кнопки с текстом кажется немного неприятным. Должно быть очевидно, как разделить это здесь (тем более, если вы попытаетесь взломать его, получив источник события).)

...