Как да актуализирате JLabel според това, което е избрано в JList

Чудех се как да актуализирам JLabel, когато е избран елемент в JList. Това ще бъде за игра и това е панелът с инвентара за играта. Искам да показва името на елемента на конкретния избран елемент. Вътре в класа играч тук са декларациите на променливите:

static Item equippedSword = Item.stickSword, equippedArmor = Item.clothesArmor, equippedShield = Item.noShield;
static String equippedSwordDisplay = equippedSword.itemName, equippedArmorDisplay = equippedArmor.itemName, equippedShieldDisplay = equippedShield.itemName;

Ето основния GUI файл (елементите от jlist на инвентара са към дъното, а слушателите за избор са към горната част):

@SuppressWarnings("serial")
public class GuiMain extends JFrame
{
//universal buttons
private JButton storeButton, backButton = new JButton("Back");
//stat and room tracking
private JLabel pstats, roomInfo;
//fillers
private JPanel filler1,filler2,filler3,filler4,filler5,filler6,filler7,filler8,filler9,filler10,filler11;
//control items
private JButton upControl, downControl, leftControl, rightControl, moveButton;
//action listener button panels
private JPanel controlPanel, mainPanel = new JPanel(), backPanel;
//gameinfo items
private JPanel gameInfoPanel;
private JButton instructionsButton, historyButton, gameInfoButton;
String gameHistory, gameInstructions;
//inventory items
private JButton inventoryButton;
@SuppressWarnings("rawtypes")
public JList swordList, armorList, shieldList, itemList;
private JPanel inventoryPanel;
private JLabel swordListLbl, armorListLbl, shieldListLbl, itemListLbl;

Player p = new Player();

//main file
public GuiMain(){
    super("Dungeon Crawler v 0.0.1 Created By: Jordan Savage");
    mainPanel.setLayout(new GridLayout(4,3));
    p.setStartingInventory();
    inventoryScheme();
    //mainbuttons
    inventoryButton = new JButton("Inventory");
    inventoryButton.setToolTipText("Gives you access to all of your items and lets you manage them");

    storeButton = new JButton("Store");
    storeButton.setToolTipText("The marketplace where you can buy and sell items such as swords and armor");

    moveButton = new JButton("Move");
    moveButton.setToolTipText("Choose where you want to move next");

    gameInfoButton = new JButton("Game Instructions and History");
    gameInfoButton.setToolTipText("All the info for the game including instructions, version info, and contact details");

    //these go inside game info
    historyButton = new JButton("Game History");
    instructionsButton = new JButton("Game Instructions");

    //stat tracking label
    pstats = new JLabel("Character Stats: " + Player.gold + " Gold, " + Player.health + " Health, and Level is " + Player.lvl);
    roomInfo = new JLabel("Character Postion: (" + Player.x + "," + Player.y + ") In room: " + Room.start.name);

    //fillers for grid layouts
    filler1 = new JPanel();filler2 = new JPanel();filler3 = new JPanel();filler4 = new JPanel();filler5 = new JPanel();filler6 = new JPanel();filler7 = new JPanel();filler7 = new JPanel();filler8 = new JPanel();filler9 = new JPanel();filler10 = new JPanel();filler11 = new JPanel();  

    //action listeners
    //how you move, will be disabled when move is forbidden
    moveButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            controlScheme();
            backToMain();
            getContentPane().removeAll();
            getContentPane().add(controlPanel, BorderLayout.CENTER);
            getContentPane().add(backPanel, BorderLayout.SOUTH);
            getContentPane().doLayout();
            getContentPane().revalidate();
            update(getGraphics());
        }
    });

    //information about the game
    gameInfoButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            gameInfoScheme();
            backToMain();
            getContentPane().removeAll();
            getContentPane().add(gameInfoPanel, BorderLayout.CENTER);
            getContentPane().add(backPanel, BorderLayout.SOUTH);
            getContentPane().doLayout();
            getContentPane().revalidate();
            update(getGraphics());
        }
    });

    inventoryButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            inventoryScheme();
            backToMain();
            getContentPane().removeAll();
            getContentPane().add(inventoryPanel, BorderLayout.CENTER);
            getContentPane().add(backPanel, BorderLayout.SOUTH);
            getContentPane().doLayout();
            getContentPane().revalidate();
            update(getGraphics());
        }
    });

    //brings you back to the main
    backButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            getContentPane().removeAll();
            getContentPane().add(mainPanel);
            getContentPane().doLayout();
            update(getGraphics());
        }
    });

    //both inside gameInfo
    //tells history of game 
    historyButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            gameInfoScheme();
            backToMain();
            JOptionPane.showMessageDialog(null, String.format(gameHistory, e.getActionCommand()));
            getContentPane().removeAll();
            getContentPane().add(gameInfoPanel, BorderLayout.CENTER);
            getContentPane().add(backPanel, BorderLayout.SOUTH);
            getContentPane().doLayout();
            getContentPane().revalidate();
            update(getGraphics());
        }
    });
    //gives instructions of how to play
    instructionsButton.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            gameInfoScheme();
            backToMain();
            JOptionPane.showMessageDialog(null, String.format(gameInstructions, e.getActionCommand()));
            getContentPane().removeAll();
            getContentPane().add(gameInfoPanel, BorderLayout.CENTER);
            getContentPane().add(backPanel, BorderLayout.SOUTH);
            getContentPane().doLayout();
            getContentPane().revalidate();
            update(getGraphics());
        }
    });
    //sword inventory selection
    swordList.addListSelectionListener(
        new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent event){
                inventoryScheme();
                backToMain();
                Player.equippedSword = (Item) swordList.getSelectedValue();
                swordListLbl.setText("Equipped Sword: " + Player.equippedSwordDisplay);
                swordListLbl.repaint();
            }
        }
    );
    //armor inventory selection
    armorList.addListSelectionListener(
        new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent event){
                inventoryScheme();
                backToMain();
                Player.equippedArmor = (Item) armorList.getSelectedValue();
                armorListLbl.setText("Equipped Armor: " + Player.equippedArmorDisplay);
                armorListLbl.repaint();
            }
        }
    );
    //shield inventory selection
    shieldList.addListSelectionListener(
        new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent event){
                inventoryScheme();
                backToMain();
                Player.equippedShield =  (Item) shieldList.getSelectedValue();
                shieldListLbl.setText("Equipped Shield: " + Player.equippedShieldDisplay);
                shieldListLbl.repaint();
            }
        }
    );

    mainPanel.add(inventoryButton);
    mainPanel.add(filler1);
    mainPanel.add(storeButton);
    mainPanel.add(filler2);
    mainPanel.add(pstats);
    mainPanel.add(filler3);
    mainPanel.add(filler4);
    mainPanel.add(roomInfo);
    mainPanel.add(filler5);
    mainPanel.add(moveButton);
    mainPanel.add(filler6);
    mainPanel.add(gameInfoButton);
    add(mainPanel);
}

//back button for all slides
public void backToMain(){
    backPanel = new JPanel();
    backPanel.setLayout(new FlowLayout());
    backPanel.add(backButton);
}

//control scheme for moving
public void controlScheme(){
    upControl = new JButton("Up");
    downControl = new JButton("Down");
    leftControl = new JButton("Left");
    rightControl = new JButton("Right");

    controlPanel = new JPanel();
    controlPanel.setLayout(new GridLayout(3,3));

    controlPanel.add(filler7);
    controlPanel.add(upControl);
    controlPanel.add(filler8);
    controlPanel.add(leftControl);
    controlPanel.add(filler9);
    controlPanel.add(rightControl);
    controlPanel.add(filler10);
    controlPanel.add(downControl);
    controlPanel.add(filler11);
}

//gameInfo scheme for settings and game info
public void gameInfoScheme(){
    gameHistory = "This game was created by Jordan Savage.He started the project in July of 2013.Any questions about how to play or coding?Email me at: [email protected]";
    gameInstructions = "In this game your player is a knight who awakes in a strange cell. You don't know where you are and you dont know what you are doing here.\n"
        + "Your player moves around in a 2D world fighting monsters and leveling up. When you fight a monster you enter into a turn based battle sequence.\n"
        + "during the turns you give damage, recieve damage, and are able to use items such as health potions. There are three ways to get items and gold.\n"
        + "The first way is to kill a monster and gain the item or gold. The second way is to find it in a treasure room which are sctattered about.\n"
        + "The third way is to use the shop. At the shop you can buy or sell items. All of your items are stored in the inventory tab";
    gameInfoPanel = new JPanel();
    gameInfoPanel.setLayout(new GridLayout(2,1));
    gameInfoPanel.add(historyButton);
    gameInfoPanel.add(instructionsButton);
}

//inventory scheme for player
@SuppressWarnings({ "unchecked", "rawtypes" })
public void inventoryScheme(){
    swordList = new JList(Player.swordinventorydisplay.toArray());
    swordList.setVisibleRowCount(4);
    swordList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    swordList.setSelectedValue(Player.equippedSwordDisplay, true);

    armorList = new JList(Player.armorinventorydisplay.toArray());
    armorList.setVisibleRowCount(4);
    armorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    armorList.setSelectedValue(Player.equippedArmorDisplay, true);

    shieldList = new JList(Player.shieldinventorydisplay.toArray());
    shieldList.setVisibleRowCount(4);
    shieldList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    shieldList.setSelectedValue(Player.equippedShieldDisplay, true);

    itemList = new JList(Player.iteminventorydisplay.toArray());
    itemList.setVisibleRowCount(4);
    itemList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    swordListLbl = new JLabel("Equipped Sword: " + Player.equippedSword.itemName);
    armorListLbl = new JLabel("Equipped Armor Kit: " + Player.equippedArmor.itemName);
    shieldListLbl = new JLabel("Equipped Shield: " + Player.equippedShield.itemName);
    itemListLbl = new JLabel("Item Inventory");

    inventoryPanel = new JPanel();
    inventoryPanel.setLayout(new GridLayout(8,1));

    inventoryPanel.add(swordListLbl);
    inventoryPanel.add(swordList);
    inventoryPanel.add(armorListLbl);
    inventoryPanel.add(armorList);
    inventoryPanel.add(shieldListLbl);
    inventoryPanel.add(shieldList);
    inventoryPanel.add(itemListLbl);
    inventoryPanel.add(itemList);
}

Всяка помощ е много ценена, тъй като претърсих десетки форуми, опитвайки се да намеря отговора. Ако имате някакви въпроси, моля, попитайте и ако имате нужда от други секции с код, моля, попитайте. Благодаря :)


person user2280906    schedule 24.10.2013    source източник


Отговори (1)


Чудех се как да актуализирам JLabel, когато е избран елемент в JList.

Вие ще искате да използвате List Selecton Listener. Разделът от урока за Swing за това как да напишете слушател за избор на списък има примерен код.

Има и други проблеми с вашия код:

getContentPane().removeAll();
getContentPane().add(controlPanel, BorderLayout.CENTER);
getContentPane().add(backPanel, BorderLayout.SOUTH);
getContentPane().doLayout();
getContentPane().revalidate();
update(getGraphics());

Това не е начинът за размяна на панели. Много по-лесно е да използвате Card Layout. Урокът за Swing има раздел на How to Use a Card Layout, който съдържа пример.

Конкретните проблеми с горния код са:

  1. Не извиквайте doLayout(). Този метод се извиква от други методи на Swing и не трябва да се налага да го извиквате ръчно.

  2. Не извиквайте update() и не използвайте getGraphics(). Swing е достатъчно умен, за да се пребоядиса, когато е необходимо. Въпреки това, може да има моменти, когато можете да използвате repaint(), за да принудите компонент да се пребоядиса.

person camickr    schedule 24.10.2013
comment
Погледнах слушателя за избор на списък, но той не отговори на въпроса ми jlabel не се актуализира по някаква причина и не знам защо - person user2280906; 24.10.2013
comment
I looked at the list selection listener but it didn't answer my question - стартирахте ли демо кода? he jlabel isn't updating for some reason - кодът ви е грешен. Публикувайте своя SSCCE, демонстриращ какво сте опитали. - person camickr; 24.10.2013
comment
Съжалявам, че не отговарям, но бях доста зает през последните няколко дни, но когато имам свободно време, със сигурност ще разгледам тези източници и ще видя дали ще помогнат - person user2280906; 29.10.2013
comment
Благодаря, че ми помогнахте - person user2280906; 13.11.2013