2013-03-14 4 views
1

У меня есть немного проблем с пониманием ActionListener, если я хочу отделить его реализацию от моего класса GUI, как бы я это сделал? Программа представляет собой простой калькулятор. Я пытаюсь думать о GUI-классе (Boundary), который имеет только кнопки, а затем отдельный класс (Control), который обрабатывает все actionevents (нажатия кнопок). Могу ли я сделать приватную переменную типа Control и заставить ее работать таким образом? Пожалуйста, помогите, если вы знаете, как :)Java, разделяющий GUI из класса ActionListener

управления Класс

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import javax.swing.*; 
import java.awt.*; 


public class Boundary extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private JPanel northPanel; 
    private JPanel southPanel; 
    private Control control; 

    public Boundary() 
    { 
     super("Calculator"); 

     getContentPane().setLayout(new BorderLayout()); 

     northPanel = new JPanel(); northPanel.setLayout(new BorderLayout()); 
     southPanel = new JPanel(); southPanel.setLayout(new GridLayout(4,4)); 
     control = new Control(); 

     JTextField numberField = new JTextField(20); 
     JTextField operationField = new JTextField(1); 

     JButton button1 = new JButton("1"); 
     JButton button2 = new JButton("2"); 
     JButton button3 = new JButton("3"); 
     JButton button4 = new JButton("4"); 
     JButton button5 = new JButton("5"); 
     JButton button6 = new JButton("6"); 
     JButton button7 = new JButton("7"); 
     JButton button8 = new JButton("8"); 
     JButton button9 = new JButton("9"); 
     JButton button0 = new JButton("0"); 
     JButton buttonequal = new JButton("="); 
     JButton buttonclear = new JButton("C"); 
     JButton buttonplus = new JButton("+"); 
     JButton buttonminus = new JButton("-"); 
     JButton buttondivide = new JButton("/"); 
     JButton buttonmultiply = new JButton("*"); 

     button1.addActionListener(control); 
     button2.addActionListener(control); 
     button3.addActionListener(control); 
     button4.addActionListener(control); 
     button5.addActionListener(control); 
     button6.addActionListener(control); 
     button7.addActionListener(control); 
     button8.addActionListener(control); 
     button9.addActionListener(control); 
     button0.addActionListener(control); 
     buttonequal.addActionListener(control); 
     buttonclear.addActionListener(control); 
     buttonplus.addActionListener(control); 
     buttonminus.addActionListener(control); 
     buttondivide.addActionListener(control); 
     buttonmultiply.addActionListener(control); 


     northPanel.add(numberField, BorderLayout.CENTER); 
     northPanel.add(operationField, BorderLayout.EAST); 

     southPanel.add(button1); 
     southPanel.add(button2); 
     southPanel.add(button3); 
     southPanel.add(buttondivide); 
     southPanel.add(button4); 
     southPanel.add(button5); 
     southPanel.add(button6); 
     southPanel.add(buttonmultiply); 
     southPanel.add(button7); 
     southPanel.add(button8); 
     southPanel.add(button9); 
     southPanel.add(buttonminus); 
     southPanel.add(buttonclear); 
     southPanel.add(button0); 
     southPanel.add(buttonequal); 
     southPanel.add(buttonplus); 

     numberField.setVisible(true); 
     numberField.setEditable(false); 
     operationField.setVisible(true); 
     operationField.setEditable(false); 







     getContentPane().add(northPanel, BorderLayout.NORTH); 
     getContentPane().add(southPanel, BorderLayout.CENTER); 

     setLocation(300,300); 
     setSize(400,400); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 

управления Класс

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 


public class Control implements ActionListener { 

    private JButton button; 

    Control() 
    { 

    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 


    } 

} 
+0

1) Не используйте более чем одну пустую строку пробела в коде. 2) Посмотрите на 'Action' &' AbstractAction'. 3) Не расширяйте 'JFrame', просто используйте экземпляр. 4) Посмотрите этот код [простой пример] (http://stackoverflow.com/a/7441804/418556) для начала. –

+2

Как указано, действие лучше, однако, оно должно работать так же, как представлено? –

+0

D.R. Как я могу реализовать, что кнопка нажата через класс Control? Я застрял, что положить в действие? Andrew Thompson, его необходимо использовать и расширять JFrame. Я также проясню пустое пространство, спасибо за ваш ввод – Zac

ответ

1

В серии if заявлений, проверьте "Действие команды":

public void actionPerformed(ActionEvent evt) { 
    String cmd = evt.getActionCommand(); 

    if("1".equals(cmd)) 
     // button1 was pressed 
    else if("2".equals(cmd)) 
     // button2 was pressed 
    . . . 

Как и было предложено, Action будет хранить все отдельно, поэтому более подробно BLE. Вот как вы можете использовать Action (или его подкласс AbstractAction):

Action button1 = new AbstractAction("1") { 
    public void actionPerformed(ActionEvent evt){ 
     // button one pressed 
    } 
}; 
Action button2 = new AbstractAction("2") { 
    public void actionPerformed(ActionEvent evt){ 
     // button two pressed 
    } 
}; 

southPanel.add(button1); 
southPanel.add(button2); 

add метод, преобразует его в JButton, и установить его в качестве слушателя.

Смежные вопросы