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.
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
@ 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 –
@ 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. –