2013-03-14 68 views
1

如果我想將它的實現從我的GUI類中分離出來,我對理解ActionListener有點麻煩,我該怎麼做?該計劃是一個簡單的計算器。我試圖想到一個只有按鈕的GUI類(邊界),然後是一個處理所有動作事件(按下按鈕)的單獨類(Control)。我可以創建一個Control類型的私有變量並使其以這種方式工作嗎?請幫助,如果你知道:)Java,從ActionListener類中分離GUI

控制類

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)代碼的一個開始。 – 2013-03-14 01:23:56

+2

正如所指出的那樣,行動更好,但是,它也應該像提出的一樣工作?! – 2013-03-14 01:27:38

+0

D.R.我如何實現通過Control類單擊按鈕?我堅持要實施什麼行動? 安德魯湯普森,其要求我使用這些和擴展JFrame。我也會爲它清除白色空間,謝謝你的輸入 – Zac 2013-03-14 01:29:01

回答

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將分開保存所有內容,因此更多reada 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,並將其設置爲監聽器。