从ListSelectionListeners和ActionListeners

时间:2015-12-12 04:48:11

标签: java user-interface static actionlistener listselectionlistener

我在GUI中使用ListSelectionListenerActionListener方法正确传递值/变量时遇到问题。基本上,我收到(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的方式。

我很感激帮助和洞察我做错了什么和/或我如何更改我的代码以允许我通过JListJButton和其他最终用户选择变量成主要方法。我正在以适当的方式断开连接。我已经阅读了一些关于静态和非静态变量的其他线程,他们过去曾帮助过我。但这是我第一次构建和操作swingawt扩展来帮助GUI。我认为,出于某种原因,将ActionListenerListSelectionListener功能合并到混音中会让我陷入困境。

1 个答案:

答案 0 :(得分:1)

non-static variable cannot be referenced from a static context

我过去常常得到这个错误......好的,所以你有两个选择:

  1. 您的字段是静态的
  2. 通过创建类(对象)的实例
  3. 使您的方法成为非静态方法

    使用该方法时,我建议您创建该类的对象,并通过执行以下操作来调用它:

    Object.method();
    

    或者,您可以将字段本身设置为静态,并通过静态变量访问它。

    静态只能访问更多静态。静态无法访问实例。

    静态方法和变量不属于类的实例,这就是您不能将它们与对象一起使用的原因。所以,再次,要么使一切都是静态的,要么使用一个对象访问方法和变量,该对象是类的一个实例。