ゲームオブジェクトがGUIオブジェクトの状態の変化をリッスンして応答できるように、ある種のリスナーを使用することをお勧めします。これを行うにはいくつかの方法がありますが、私が見つけた最もエレガントで便利なのは、Swing独自のPropertyChangeSupportを使用してPropertyChangeListenersを使用できるようにすることです。すべてのSwingコンポーネントでPropertyChangeListenerを追加できます。そして私はあなたがゲームがそうのように(大文字であるべきである)あなたのWampusGUIクラスにオブジェクトを1を追加したことを、あなたがこれを行うことを示唆している:
public Game(WampusGUI w) {
gui = w;
gui.addPropertyChangeListener(new PropertyChangeListener() {
// ....
}
これは、ゲームは、GUIの状態の変化を聞くことができます。
guiのuserCommand Stringを "バインドされたプロパティ"にすると、すべてのリスナーに変更を通知するプロパティ変更サポートを起動するsetterメソッドを提供します。私はそうのようにこれを行うだろう:
private void enterButtonActionPerformed(java.awt.event.ActionEvent evt) {
setUserCommand(commandText.getText());
}
そのようにのように反応するだろうゲームのプロパティ変更リスナー:
gui.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent pcEvt) {
// is the property being changed the one we're interested in?
if (WampusGUI.USER_COMMAND.equals(pcEvt.getPropertyName())) {
// get user command:
String userCommand = pcEvt.getNewValue().toString();
// then we can do with it what we want
play(userCommand);
}
}
});
public class WampusGUI extends JFrame {
public static final String USER_COMMAND = "user command";
// ....
private void setUserCommand(String userCommand) {
String oldValue = this.userCommand;
String newValue = userCommand;
this.userCommand = userCommand;
firePropertyChange(USER_COMMAND, oldValue, newValue);
}
は、その後にのみ、このsetterメソッドを経由して、この文字列の値を変更します
このテクニックの美しさの1つは、観察されたクラスのGUIが、オブザーバークラス(ゲーム)についての知識を持っている必要がないということです。小さな実行可能な例は次のようなものです:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
public class WampusGUI extends JFrame {
public static final String USER_COMMAND = "user command";
private String userCommand;
private JTextArea displayTextArea = new JTextArea(10, 30);
private JTextField commandText = new JTextField(10);
public WampusGUI() {
initComponents();
}
private void setUserCommand(String userCommand) {
String oldValue = this.userCommand;
String newValue = userCommand;
this.userCommand = userCommand;
firePropertyChange(USER_COMMAND, oldValue, newValue);
}
private void initComponents() {
displayTextArea.setEditable(false);
displayTextArea.setFocusable(false);
JButton enterButton = new JButton("Enter Command");
enterButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
enterButtonActionPerformed(evt);
}
});
JPanel commandPanel = new JPanel();
commandPanel.add(commandText);
commandPanel.add(Box.createHorizontalStrut(15));
commandPanel.add(enterButton);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
mainPanel.add(new JScrollPane(displayTextArea));
mainPanel.add(commandPanel, BorderLayout.SOUTH);
add(mainPanel);
}
public void setTextArea(String text) {
displayTextArea.append(text);
}
private void enterButtonActionPerformed(java.awt.event.ActionEvent evt) {
setUserCommand(commandText.getText());
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
WampusGUI w = new WampusGUI();
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w.pack();
w.setLocationRelativeTo(null);
w.setVisible(true);
Game g = new Game(w);
g.play();
}
});
}
}
class Game {
private WampusGUI gui;
public Game(WampusGUI w) {
gui = w;
gui.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent pcEvt) {
// is the property being changed the one we're interested in?
if (WampusGUI.USER_COMMAND.equals(pcEvt.getPropertyName())) {
// get user command:
String userCommand = pcEvt.getNewValue().toString();
// then we can do with it what we want
play(userCommand);
}
}
});
}
public void play() {
gui.setTextArea("Welcome!\n");
gui.setTextArea("Please enjoy the game!\n");
}
public void play(String userCommand) {
// here we can do what we want with the String. For instance we can display it in the gui:
gui.setTextArea("User entered: " + userCommand + "\n");
}
}
"値は最初にnullになります"とはどういう意味ですか?基本的には、デザインを変更する必要があります。グローバル変数は本当に良い解決策ではありません。 –
私は@jonに同意します。あなたの文字列は、ユーザがそれを変更する機会があるまで、まともな値を持たないでしょう。また、あなたの永遠のforループは、Swingアプリケーションのための良いデザインではありません。あなたが実際にJTextFieldの状態を変更してからこれを実行するのを聞くためにリスナーを使用したいのではないかと思います。おそらく、Swing Timerを使用することも検討したいと思うかもしれませんが、あなたのプログラムについてもっと知り、それが何をすべきかを知るまでは分かりません。 –
教えてください:このコードで何をしようとしていますか? –