我在GUI中使用ListSelectionListener
和ActionListener
方法正确传递值/变量时遇到问题。基本上,我收到(6)源自同一问题的六个错误。
non-static variable cannot be referenced from a static context
我之前遇到过完全理解这个错误的问题,并且认为我有这个错误。但是,一旦我们开始学习GUI以及如何实现它们,我再次失去理解。理想情况下,我希望采取最终用户的决定并将其传递给主GUI功能。以下是public class EnemyPanel extends JPanel
的一部分,它来自我的主程序JFrame
。在我尝试执行以下操作之前一切都很好:
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;
}
基本上,最终用户从JList
中进行选择,并根据他们的选择,在上述方法中将.png显示并将其选择记录为weaponSlctd
。我的问题是,我想采用该值并在JFrame
的以下方法中使用它:
private class RunButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
playerWeaponType = PlayerPanel.getPlayerWeaponSelected();
}
}
我有更多代码,但由于几个原因,我认为没有必要发布所有代码。 A)玩家遵循我的JLabels
中的其他人设计的模板。 B)编译期间的错误来自方法getPlayerSelected()
,它取决于WeaponListListener
类。我很肯定这是我尝试将整数weaponSlctd
从一个方法传递到下一个方法的方式,以及从一个extended JPanel
传递给调用它的父JFrame
的方式。
我很感激帮助和洞察我做错了什么和/或我如何更改我的代码以允许我通过JList
,JButton
和其他最终用户选择变量成主要方法。我正在以适当的方式断开连接。我已经阅读了一些关于静态和非静态变量的其他线程,他们过去曾帮助过我。但这是我第一次构建和操作swing
和awt
扩展来帮助GUI。我认为,出于某种原因,将ActionListener
和ListSelectionListener
功能合并到混音中会让我陷入困境。
答案 0 :(得分:1)
non-static variable cannot be referenced from a static context
我过去常常得到这个错误......好的,所以你有两个选择:
使用该方法时,我建议您创建该类的对象,并通过执行以下操作来调用它:
Object.method();
或者,您可以将字段本身设置为静态,并通过静态变量访问它。
静态只能访问更多静态。静态无法访问实例。
静态方法和变量不属于类的实例,这就是您不能将它们与对象一起使用的原因。所以,再次,要么使一切都是静态的,要么使用一个对象访问方法和变量,该对象是类的一个实例。