2015-04-30 2 views
1

Мое приложение имеет 15 различных кнопок, и мне было интересно, если у вас есть отдельный класс для каждого слушателя кнопки? В настоящее время у меня есть только один класс, который обрабатывает все кнопки с помощью переключателя/футляра, но его трудно поддерживать и читать.Индивидуальный класс для каждого слушателя-исполнителя?

Я не большой поклонник использования анонимных классов - опять же из-за удобочитаемости.

Любые предложения, которые могут помочь мне решить эту проблему, будут оценены.

Я использую Java Swing, если это имеет значение.

+0

Вы смотрели в лямбда-выражения? Они являются альтернативой досадным классам для функциональных интерфейсов (интерфейсы только с одним методом). –

+1

В общем, да, это хорошая идея иметь отдельный прослушиватель действий для каждого JButton. Однако, если группа JButtons логически сгруппирована, например, 3 x 3 сетки JButtons для игры с тик-таковыми, то имеет смысл иметь один прослушиватель действий для группы JButtons. –

ответ

1

Вы можете использовать один класс, но это не очень хороший dsign, потому что вам необходимо применить принцип разделения проблем. Вы хотите согласованности в классе, чтобы методы были значимыми и логичными в соответствии с бизнес-доменом, с которым вы имеете дело. Также в некоторых случаях один и тот же прослушиватель действий может обрабатывать множество кнопок.

Пример: предполагается, что я строю калькулятор. Я знаю, что поведение операторов аналогично, когда их нажимают. И так с кнопками цифр. Поэтому я могу иметь некоторые классы, скажем

public class OperationActionListener { 

    public void actionPerformed(ActionEvent e) { 
     // Handle what happens when the user click on +, -, * and/buttons 
    } 
} 


public class DigitActionListener { 

    public void actionPerformed(ActionEvent e) { 
     // Handle what happens when the user click on a digit button 
    } 
} 

т.д.

Теперь в моем пользовательском интерфейсе Добавит экземпляр одного и тот же слушатель действия

JButton buttonPlus = new JButton("+") 
JButton buttonMinus = new JButton("-"); 
... 

JButton buttonOne = new JButton("1"); 
JButton buttonTwo = new JButton("2"); 
... 

OperationActionListener operationListener = new OperationActionListener(); 
DigitActionListener digitListener = new DigitsActionListener(); 

buttonPlus.addActionListener(operationListener); 
buttonMinus.addActionListener(operationListener); 
.... 

buttonOne.addActionListener(digitListener); 
buttonTwo.addActionListener(digitListener); 
.... 

Надеется, что это помогает.

+0

Так что не проблема иметь несколько классов? В моем случае почти все кнопки должны изменить пользовательский интерфейс, и я должен передать экземпляр кадра слушателю, чтобы я мог внести изменения. Что-то вроде этого: 'someButton.addActionListener (новый ButtonListener (this));' Это вызовет проблемы с производительностью? – kraikov

+0

Отсутствие нескольких классов не является проблемой само по себе. Но проектирование классов всегда должно быть сделано. Вместо того, чтобы делать 'new ButtonListener (this)', когда вы добавляете прослушиватель действий на каждую кнопку, делайте это раз и навсегда с помощью 'ButtonListener listener = new ButtonListener (this)', а затем 'someButton.addActionListener (listener)' и someButton2 .addActionListener (слушатель). Таким образом, один и тот же прослушиватель повторно используется. – alainlompo

+0

Можете ли вы объяснить мне, в чем разница между использованием анонимного объекта и созданием не анонимного объекта? Заранее спасибо. – kraikov

1

Вот пример того же самого слушателя используется несколькими кнопками:

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

public class CalculatorPanel extends JPanel 
{ 
    private JTextField display; 

    public CalculatorPanel() 
    { 
     Action numberAction = new AbstractAction() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
//    display.setCaretPosition(display.getDocument().getLength()); 
       display.replaceSelection(e.getActionCommand()); 
      } 
     }; 

     setLayout(new BorderLayout()); 

     display = new JTextField(); 
     display.setEditable(false); 
     display.setHorizontalAlignment(JTextField.RIGHT); 
     add(display, BorderLayout.NORTH); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(0, 5)); 
     add(buttonPanel, BorderLayout.CENTER); 

     for (int i = 0; i < 10; i++) 
     { 
      String text = String.valueOf(i); 
      JButton button = new JButton(text); 
      button.addActionListener(numberAction); 
      button.setBorder(new LineBorder(Color.BLACK)); 
//   button.setPreferredSize(new Dimension(50, 50)); 
      buttonPanel.add(button); 

      InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
      inputMap.put(KeyStroke.getKeyStroke(text), text); 
      inputMap.put(KeyStroke.getKeyStroke("NUMPAD" + text), text); 
      button.getActionMap().put(text, numberAction); 
     } 
    } 

    private static void createAndShowUI() 
    { 
     UIManager.put("Button.margin", new Insets(10, 10, 10, 10)); 

     JFrame frame = new JFrame("Calculator Panel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new CalculatorPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
Смежные вопросы