Как изменить значение в HashMap из другого класса

Я написал около 1680 строк кода, в основном создавая графический интерфейс. Я наконец-то пытаюсь заставить графический интерфейс «сделать что-нибудь интересное». Однако код, который у меня есть, не дает желаемого результата. У меня есть несколько соответствующих фрагментов кода ниже.

Сначала у меня есть класс CharLocStorage для создания хэш-карты и присвоения хеш-карте некоторых начальных значений.

public static class CharLocStorage 
{
    private HashMap<String, Integer> charLocStorage = new HashMap<String, Integer>();
    public HashMap<String, Integer> getCharLocStorageMap() 
    {
        boolean bContainsKey = charLocStorage.containsKey("Han Solo");
        if (bContainsKey == false)
        {
            charLocStorage.put("Han Solo",4);
        }
        boolean bContainsKey2 = charLocStorage.containsKey("Luke Skywalker");
        if (bContainsKey2 == false)
        {
            charLocStorage.put("Luke Skywalker",4);
        }
        return charLocStorage;
    }
}

Во-вторых, у меня есть класс CreatePlanetFrame для создания JFrame для планеты. (Здесь есть вторая хэш-карта, но мне никогда не нужно будет изменять значения в этой хэш-карте. Эта вторая хэш-карта работает нормально и не имеет ничего общего с вопросом.)

public static class CreatePlanetFrame
{
    CharLocStorage a = new CharLocStorage();
    public void createPlanetFrame (String sPlanetName)
    {

....

String sLocName = sPlanetName;

                    HashMap<String,Integer> hmap = new HashMap<String,Integer>();

                    /*Adding elements to HashMap*/
                    hmap.put("Bastion",1);
                    hmap.put("Bescane",2);
                    hmap.put("Borosk",3);
                    hmap.put("Dantooine",4);
                    hmap.put("Dubrillion",5);
                    hmap.put("Entralla",6);
                    hmap.put("Garqi",7);
                    hmap.put("Gree",8);
                    hmap.put("Jaemus",9);
                    hmap.put("Kalee",10);
                    hmap.put("Moltok",11);
                    hmap.put("Muunilinst",12);
                    hmap.put("Mygeeto",13);
                    hmap.put("Ord Biniir",14);
                    hmap.put("Ord Trasi",15);
                    hmap.put("Valc",16);
                    hmap.put("Yaga Minor",17);

                int nlocPlanet = hmap.get(sLocName);

                    HashMap<String, Integer> charLocStorage = a.getCharLocStorageMap();

                    /*Adding elements to HashMap*/


                int a;
                String sPersonnel = "";
                for (a=1;a<=2;a++)
                {
                    if (a==1) {sPersonnel = "Han Solo";}
                    if (a==2) {sPersonnel = "Luke Skywalker";}
                    int nlocPersonnel = charLocStorage.get(sPersonnel);
                    if (nlocPersonnel == nlocPlanet)
                    {
                        JPanel panelDA1 = new JPanel();

                        JLabel labelDA1 = new JLabel(sPersonnel);

                        JPanel panelDAA1 = new JPanel();
                        panelDAA1.add(labelDA1);
                        panelDA1.add(panelDAA1);

                        JButton buttonDA1 = new JButton("Move");
                        panelDA1.add(buttonDA1);
                        buttonDA1.addActionListener(new ActionMove());
                        buttonDA1.setName(sPersonnel);

....

В-третьих, у меня есть класс ActionMove.

public static class ActionMove implements ActionListener
{
    public void actionPerformed (ActionEvent e) 
    {
        String sCharName = ((JButton)e.getSource()).getName();
        CreateMoveFrame CMF = new CreateMoveFrame();
        CMF.createMoveFrame(sCharName);
    }
}

В-четвертых, наконец, у меня есть класс CreateMoveFrame.

    public static class CreateMoveFrame
{
    CharLocStorage a = new CharLocStorage();
    public void createMoveFrame (String sCharName)
    {

....

JPanel panel1 = new JPanel(new GridLayout(3,1));

        JLabel label1 = new JLabel("Move "+sCharName+" to ");

        JPanel panel2 = new JPanel();
        panel2.add(label1);
        panel1.add(panel2);

        String[] choices = { "Bastion","Bescane", "Borosk","Dantooine","Dubrillion","Entralla","Garqi","Gree", "Jaemus","Kalee","Moltok","Muunilinst","Mygeeto","Ord Biniir", "Ord Trasi","Valc","Yaga Minor"};

        final JComboBox<String> cb = new JComboBox<String>(choices);

        cb.setVisible(true);
        panel1.add(cb);

        JPanel panel3 = new JPanel();

            JButton button1 = new JButton("MOVE");
            panel3.add(button1);
            //button1.addActionListener(new ActionMoveClick());
            button1.setName(sCharName);

                HashMap<String,Integer> hmap = new HashMap<String,Integer>();

                /*Adding elements to HashMap*/
                hmap.put("Bastion",1);
                hmap.put("Bescane",2);
                hmap.put("Borosk",3);
                hmap.put("Dantooine",4);
                hmap.put("Dubrillion",5);
                hmap.put("Entralla",6);
                hmap.put("Garqi",7);
                hmap.put("Gree",8);
                hmap.put("Jaemus",9);
                hmap.put("Kalee",10);
                hmap.put("Moltok",11);
                hmap.put("Muunilinst",12);
                hmap.put("Mygeeto",13);
                hmap.put("Ord Biniir",14);
                hmap.put("Ord Trasi",15);
                hmap.put("Valc",16);
                hmap.put("Yaga Minor",17);

                String sLocName = cb.getSelectedItem().toString();
                int nLocPlanet = hmap.get(sLocName);

            button1.addActionListener
            (new ActionListener() 
                {
                    public void actionPerformed(ActionEvent e) 
                    {
                        a.charLocStorage.put(sCharName,nLocPlanet);
                        HashMap<String,Integer> charLocStorage = a.getCharLocStorageMap();
                        charLocStorage.put(sCharName,nLocPlanet);
                        frame9.dispose();
                    }          
                }
            );

....

Кажется, все работает, за исключением того, что значение «nLocPlanet» не обновляется в хэш-карте. (Хан Соло и Люк Скайуокер оба появляются на Дантуине, но я не могу заставить их переехать в другое место, и я могу распечатать и sCharName, и nLocPlanet, используя вторую кнопку перемещения.)

Прошу прощения за длину сообщения, я хотел убедиться, что весь соответствующий код был виден.

(Я пишу код в BlueJ. У меня нет синтаксических ошибок.)

Обновите свой вопрос, чтобы он содержал только необходимая информация. Просто слишком много информации и нет ясности.

Nicholas K 27.10.2018 08:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
72
1

Ответы 1

Я разобрался в проблеме. Я забыл сослаться на класс исходной хэш-карты в прослушивателе действий button1. Кроме того, хэш-карта должна быть статической переменной.

button1.addActionListener
            (new ActionListener() 
                {
                    public void actionPerformed(ActionEvent e) 
                    {
                        HashMap<String,Integer> charLocStorage = a.getCharLocStorageMap();
                        CharLocStorage.charLocStorage.put(sCharName,nLocPlanet);
                        frame9.dispose();
                    }          
                }
            );

а также

public static class CharLocStorage 
{
    private static HashMap<String, Integer> charLocStorage = new HashMap<String, Integer>();
    public HashMap<String, Integer> getCharLocStorageMap() 
    {
        boolean bContainsKey = charLocStorage.containsKey("Han Solo");
        if (bContainsKey == false)
        {
            charLocStorage.put("Han Solo",4);
        }
        boolean bContainsKey2 = charLocStorage.containsKey("Luke Skywalker");
        if (bContainsKey2 == false)
        {
            charLocStorage.put("Luke Skywalker",4);
        }
        return charLocStorage;
    }
}

Другие вопросы по теме