L'accès variable statique à partir d'une autre classe
J'ai deux classes du même package. j'ai déclaré un static variable
dans une classe et souhaitez accéder à cette variable dans une autre classe.
Voici mon code dans lequel j'ai déclaré une variable statique
public class wampusGUI extends javax.swing.JFrame {
static String userCommand;
public wampusGUI() {
initComponents();
}
public void setTextArea(String text) {
displayTextArea.append(text);
}
private void enterButtonActionPerformed(java.awt.event.ActionEvent evt) {
userCommand = commandText.getText();
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
wampusGUI w = new wampusGUI();
w.setVisible(true);
Game g = new Game(w);
g.play();
}
});
}
}
Voici le code dont je veux accéder à une variable
public class Game {
private wampusGUI gui;
public Game(wampusGUI w) {
world = new World();
world.start();
gui = w;
}
public void play() {
gui.setTextArea(welcome());
gui.setTextArea(describe());
for (;;) {
String s = userCommand; //here value should come should
System.out.println(userCommand);
Command c = Command.create(s);
String r = c.perform(world);
//is game over?
if (r == null) {
break;
}
System.out.println(r);
}
System.out.println("Game over");
}
}
Cependant, je peux passer la variable de première classe comme un argument. mais le problème est que, lorsque je lance le programme, la valeur null première fois, je ne veux pas. je veux quand je entrer une valeur dans textfield
, alors il devrait aller à une autre classe.
Merci.
Qu'entendez-vous par "la valeur null première fois"? Fondamentalement, vous devriez être en train de changer votre conception - avoir une variable globale est vraiment pas une bonne solution.
Je suis d'accord avec @jon. Votre Chaîne de ne pas avoir une bonne valeur jusqu'à ce que l'utilisateur a eu la chance de le changer. Aussi votre toujours pour la boucle n'est pas un bon modèle pour une application Swing. Je me demandais si vous voulez vraiment utiliser un écouteur au lieu de l'écouter pour l'utilisateur de changer un component swing jtextfield de l'état et à agir sur le présent. Peut-être vous aurez également besoin de regarder dans l'aide d'un Swing Timer, difficile de savoir si jusqu'à ce que nous en savons plus au sujet de votre programme et ce qu'il est censé faire.
S'il vous plaît dites-nous: qu'essayez-vous de faire avec ce code?
ce que je suis en train de faire est , en première interface graphique de fichiers lorsque l'utilisateur doit entrer le texte dans
Je suis d'accord avec @jon. Votre Chaîne de ne pas avoir une bonne valeur jusqu'à ce que l'utilisateur a eu la chance de le changer. Aussi votre toujours pour la boucle n'est pas un bon modèle pour une application Swing. Je me demandais si vous voulez vraiment utiliser un écouteur au lieu de l'écouter pour l'utilisateur de changer un component swing jtextfield de l'état et à agir sur le présent. Peut-être vous aurez également besoin de regarder dans l'aide d'un Swing Timer, difficile de savoir si jusqu'à ce que nous en savons plus au sujet de votre programme et ce qu'il est censé faire.
S'il vous plaît dites-nous: qu'essayez-vous de faire avec ce code?
ce que je suis en train de faire est , en première interface graphique de fichiers lorsque l'utilisateur doit entrer le texte dans
textarea
et appuyez sur enter
alors que la valeur doit aller dans une autre classe play() method
et qui va exécuter la commande par command class
OriginalL'auteur RK. | 2012-09-13
Vous devez vous connecter pour publier un commentaire.
Je vous suggère d'utiliser un écouteur d'une sorte ou d'une autre pour permettre le Jeu d'objets d'écouter et de répondre aux changements dans l'état de l'objet graphique. Il y a plusieurs façons de le faire, mais l'un des plus élégant et le plus utile que j'ai trouvé est d'utiliser Swing est innée PropertyChangeSupport pour vous permettre d'utiliser PropertyChangeListeners. Tous les composants Swing vous permettra d'ajouter un PropertyChangeListener. Et donc, je vous suggère de le faire, que vous avez le Jeu en ajouter un à votre WampusGUI classe (qui doivent être capitalisés) objet:
Cela permettra Jeu pour écouter les changements dans l'interface graphique de l'état.
Vous devrez alors vous voulez faire de la gui userCommand Chaîne "lié à la propriété", ce qui signifie lui donnant une méthode de définition qui va déclencher le changement de propriété d'un soutien informer tous les auditeurs de changement. Je voudrais faire cela de la sorte:
Alors vous ne changer cette Chaîne de valeur par l'intermédiaire de cette méthode de définition:
Le Jeu du changement de propriété d'auditeur serait alors de répondre de la sorte:
L'une des beautés de cette technique est que l'on classe, le GUI, ne pas avoir connaissance de l'observateur de la classe (le Jeu). Un petit exécutable exemple de cela est de la sorte:
OriginalL'auteur Hovercraft Full Of Eels
En regardant ton code, il semble que vous souhaitez afficher les boîtes de dialogue de votre utilisateur avec un certain texte
et parfois, ce dialogue devrait capter la saisie de l'utilisateur, qui est traitée par la suite.
setTextArea
les appels ne sont pas ce que vous voulez utiliser. L'utilisateur ne verra jamais le message de bienvenue, il sera immédiatement remplacé par le décrire message.Command
classe va faire, mais je vois une boucle infinie sur laEvent Dispatch Thread
qui n'est jamais une bonne chose. Jetez un oeil à la La simultanéité dans Swing tutoriel pour plus d'informationsfor
boucle, l'utilisateur ne sera tout simplement pas être capable de saisir une commande que l'EDT est occupé de la manipulation de votre boucle. Ce que vous avez besoin est un appel de blocage permettant à l'utilisateur de fournir des commentaires (pas de blocage de l'EDT, mais simplement bloquer l'exécution de votre code). Les méthodes statiques dans leJOptionPane
classe sont parfaitement adapté pour cela (par exemple, laJOptionPane#showInputDialog
). Ces méthodes ont également un mécanisme pour transmettre à l'utilisateur d'entrée de retour à l'appel de code sans les variables statiques, ce qui résout votre problème.OriginalL'auteur Robin
Je suis d'accord avec Jon Skeet que ce n'est pas une bonne solution...
Mais si tu veux une solution sale à ur problème, alors vous pouvez essayer ceci:
dans l'autre classe d'utilisation:
Ce genre de code est-il dans certains de nos anciens projets... et je déteste cela.
je n'ai jamais dit que c'est une solution élégante 😉
Vrai. Je suppose que cela dépend si le programmeur veut avoir les données poussé par un auditeur ou tiré par des bureaux de vote. Si possible, je préfère l'approche de l'auditeur, mais ce n'est pas toujours possible de le faire.
OriginalL'auteur PC.