首先我要感謝大家誰回答的問題。沒有你我就不知道了。你們每個人都給了我一個難題。
我最初的問題是:
TextInputListener
類需要訪問buttonX
。
TextInputListener
類需要訪問textField
。
在TextInputListener類我計算過,它並不真正需要訪問的按鈕,它只有知道如果e.getSource()
等於button
。因此,我在Window
類中創建了一個方法,其中ActionEvent
作爲參數(如e
),將其與buttonX
進行比較,然後返回答案。
//Window.java
...
boolean isButton0(ActionEvent e) {
return e.getSource() == buttons[0];
}
boolean isButton1(ActionEvent e) {
return e.getSource() == buttons[1];
}
...
問題1解決:
所以我現在更近了一步。我可以確定是否按下了button1
,button2
..,但沒有聲明按鈕是公開的,也沒有通過像getButton1()
這樣的「getter」方法返回它。
// TextInputListener.java
public class TextInputListener implements ActionListener {
Window window;
@Override
public void actionPerformed(ActionEvent e) {
if (window.isButton0(e)) {
//textField.setText("0")
} else if (window.isButton1(e)) {
//textField.setText("1")
}
...
}
}
(TextInputListener.java和Window.java是在相同的封裝所以我能夠申報方法包私人。)
問題2解決:
一旦再次TextInputListener
並不真的需要textField
(作爲一個變量)它只需要設置其文本。所以我創建了另一個包私鑰方法setOutputText(String text)
來設置文本。下面的代碼:
// Window.java
public class Window {
TextField textField;
JButton button1;
JButton button2;
...
void setText(String text) {
textField.setText(text);
}
}
// TextInputListener.java
public class TextInputListener implements ActionListener {
Window window;
@Override
public void actionPerformed(ActionEvent e) {
if (window.isButton0(e)) {
window.setText("0");
} else if (window.isButton1(e)) {
window.setText("1");
}
...
}
}
把一切TOGETHER:
現在剩下的工作就是讓類的每個實例來了解彼此的唯一的事情。在TextInputListener
類添加以下代碼:
public void listenTo(Window window) {
this.window = window;
}
在Window類我不得不把ActionListener
添加到每個按鈕,所以我加了如下代碼:
public void setActionListener(ActionListener l) {
for (int i = 0; i < buttons.length; i++) {
buttons[i].addActionListener(l);
}
}
這基本上!主要設置一切,它的工作。下面是(幾乎)完整的最終代碼:
// MyApp.java
public class MyApp {
public static void main(String[] args) {
Window myWindow = new Window();
TextInputListener myTextInputListener = new TextInputListener();
myWindow.setActionListener(myTextInputListener);
myTextInputListener.listenTo(myWindow);
}
}
// Window.java
public class Window {
TextField textField;
JButton button1;
JButton button2;
...
void setText(String text) {
textField.setText(text);
}
public void setActionListener(ActionListener l) {
for (int i = 0; i < buttons.length; i++) {
buttons[i].addActionListener(l);
}
}
}
// TextInputListener.java
public class TextInputListener implements ActionListener {
Window window;
public void listenTo(Window window) {
this.window = window;
}
@Override
public void actionPerformed(ActionEvent e) {
if (window.isButton0(e)) {
window.setText("0");
} else if (window.isButton1(e)) {
window.setText("1");
}
...
}
}
#1)擴展Action而不是實現ActionListener。 #2)你可以在Window類中定義動作,或者傳入將要操作的參數。這兩種方法都很好。 –