0

Je rencontre des problèmes en passant correctement les valeurs/variables comme résultat des méthodes ListSelectionListener et ActionListener à partir de mon interface graphique. Fondamentalement, je reçois (6) six erreurs provenant du même problème.Passer des variables à partir ListSelectionListeners et ActionListeners

non-static variable cannot be referenced from a static context

J'ai eu des problèmes avant de comprendre pleinement cette erreur et pensé que je l'avais. Mais une fois que nous avons commencé à apprendre les interfaces graphiques et à les implémenter, j'ai de nouveau perdu la compréhension. Idéalement, je souhaite prendre une (des) décision (s) de l'utilisateur final et la transmettre à la fonction principale de l'interface graphique. Voici une partie de public class EnemyPanel extends JPanel qui se nourrit de mon principal JFrame de mon programme. Tout allait bien jusqu'à ce que je tentais de faire ce qui suit:

public class PlayerPanel extends JPanel 
{ 

private JPanel compPlayerPanel; 
private JPanel playerPanel; 
private JList playerList; 
private JPanel playerListPanel; 
private JLabel playerImageLabel; 
private JPanel playerImagePanel; 
private JPanel buttonPanel; 
private JButton selctButton; 
private ImageIcon playerImage; 
private String playerSlctd; 
public int playerChoice; 
public int playerWeaponChoice; 


private void buildWeaponSelectionPanel() 
{ 
    weaponPanel = new JPanel(); 

    weaponListPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
    weaponListPanel.setPreferredSize(new Dimension(180, 85)); 
    weaponListPanel.setBackground(Color.WHITE); 
    weaponPanel.setLayout(new BoxLayout(weaponPanel, BoxLayout.Y_AXIS)); 

    weaponList = new JList(weapons); 

    weaponList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    weaponList.addListSelectionListener(new WeaponListListener()); 
    weaponListPanel.add(weaponList); 
    weaponPanel.add(weaponListPanel); 
} 
private class WeaponListListener implements ListSelectionListener 
{ 
    public void valueChanged(ListSelectionEvent e) 
    { 
     weaponSlctd = (String) weaponList.getSelectedValue(); 

     if (weaponSlctd == "Mace") 
     { 
      weaponImage = new ImageIcon("Mace.png"); 
      playerWeaponChoice = 1; 
     } 
     else if(weaponSlctd == "Short Sword") 
     { 
      weaponImage = new ImageIcon("ShortSword.png"); 
      playerWeaponChoice = 2; 
     } 
     else if(weaponSlctd == "Long Sword") 
     { 
      weaponImage = new ImageIcon("LongSword.png"); 
      playerWeaponChoice = 3; 
     } 
     else if(weaponSlctd == "Axe") 
     { 
      weaponImage = new ImageIcon("Axe.png"); 
      playerWeaponChoice = 4; 
     } 

     weaponImageLabel.setIcon(weaponImage); 

     weaponImageLabel.setText(null); 
    } 
} 

public int getPlayerWeaponSelected() 
{ 
    return playerWeaponChoice; 
} 

Fondamentalement, l'utilisateur final sélectionne à partir d'un JList et en fonction de leur sélection, une affiche .png et leur sélection est enregistrée comme weaponSlctd dans la méthode ci-dessus. Mon problème est que je voudrais prendre cette valeur et l'utiliser dans la méthode suivante de mon JFrame:

private class RunButtonListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
        playerWeaponType = PlayerPanel.getPlayerWeaponSelected(); 
    } 
} 

J'ai un code beaucoup plus mais je ne pense pas qu'il est nécessaire de publier tout en raison de plusieurs raisons. A) le joueur suit un modèle que mes autres JLabels sont conçus après. B) L'erreur lors de la compilation provient de la méthode getPlayerSelected() qui dépend de la classe WeaponListListener. Je suis positif que c'est la façon dont je tente de passer l'entier weaponSlctd d'une méthode à l'autre, et d'un extended JPanel au parent JFrame qui appelle tout cela. J'apprécierais une aide et un aperçu de ce que je fais mal et/ou comment je peux changer mon code qui me permettra de passer JList, JButton, et d'autres variables de sélection d'utilisateur final dans une méthode principale. J'ai une déconnexion sur la façon appropriée de le faire. J'ai lu quelques-uns des autres sujets concernant les variables statiques et non-statiques et ils m'ont aidé dans le passé. Mais c'est la première fois que je construis et manipule les extensions swing et awt pour vous aider avec une interface graphique. Je crois que pour une raison quelconque incorporant la fonctionnalité ActionListener et ListSelectionListener dans le mélange m'a lancé pour une boucle.

Répondre

1
non-static variable cannot be referenced from a static context 

Je les utilise pour cette erreur tellement ... D'accord, vous avez deux options comme de ce qu'il faut faire:

  1. Vous faites vos champs statiques
  2. Faites vos méthodes non statique en créant une instance de la classe (objet)

Lorsque vous utilisez cette méthode, je vous suggère de faire un objet de la classe, et l'appeler en faisant:Ou bien, vous pouvez simplement rendre les champs statiques et y accéder via des variables statiques.

La statique peut uniquement accéder à plus de statique. Static ne peut pas accéder à l'instance.

Les méthodes et variables statiques n'appartiennent pas à une instance d'une classe, ce qui explique pourquoi vous ne pouvez pas les utiliser avec un objet.Donc, encore une fois, soit rendre tout statique, soit accéder à la méthode et à la variable en utilisant un objet, qui est une instance de la classe.

+0

Je ne comprends pas complètement A) Qu'est-ce que cela signifie d'implémenter 'Object.method()' à partir de votre exemple basé sur mon code et B) comprendre complètement ce que je fais provoque cette erreur. J'ai lu les explications des peuples sur statique et non statique et je ne comprends toujours pas. J'imagine que j'ai besoin de quelqu'un pour "le faire" pour moi parce que je n'arrive toujours pas à relier les points ici. – Pwrcdr87

+0

@ Pwrcdr87 ** A) ** OK, en java, vous pouvez faire une chose appelée un objet. Cet objet est une instance d'une classe. Donc, si une méthode est dans une certaine classe, vous pouvez créer un objet ** de ** cette classe, et appeler la méthode en faisant 'Object.method()'. ** B) ** Oubliez l'électricité statique pendant une seconde. Pensez juste à une méthode régulière, d'accord? Appelons la méthode A. La méthode A est dans la classe 'myClass'. Donc, pour accéder à A, nous créons un objet de 'myClass' et appelons la méthode A en faisant' myClass.A'. Maintenant, il y a des choses appelées méthodes statiques. Ne vous inquiétez pas de ce que cela signifie en ce moment, il suffit de savoir, pour y accéder –

+0

@ Pwrcdr87 vous devrez simplement appeler la méthode. C'est tout. Oubliez le statique pour le moment, il est avancé, mais créez simplement l'objet comme je l'ai suggéré dans A. –