Я написал около 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. У меня нет синтаксических ошибок.)




Я разобрался в проблеме. Я забыл сослаться на класс исходной хэш-карты в прослушивателе действий 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;
}
}
Обновите свой вопрос, чтобы он содержал только необходимая информация. Просто слишком много информации и нет ясности.