简体   繁体   English

如何根据在JList中选择的内容更新JLabel

[英]How to update a JLabel according to what has been selected in a JList

I was wondering how to update a JLabel when an item in a JList has been selected. 我想知道当在JList中选择一个项目时如何更新JLabel。 This will be for a game and it is the inventory panel for the game. 这将用于游戏,并且是游戏的库存面板。 I want it to display the itemName of the specific Item that has been selected. 我希望它显示已选择的特定项目的itemName。 Inside the player class here are the variable declarations: 在播放器类内部,是变量声明:

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

Here is the Main Gui File(The inventory jlist items are towards the bottom and the selection listeners are towards the top): 这是Main 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: jordansavage99@gmail.com";
    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);
}

Any help is very appreciated as I have been searched dozens of forums trying to find the answer. 非常感谢您的帮助,因为已经在数十个论坛中搜索了我,试图找到答案。 If you have any questions please ask and if you need other code sections please ask. 如有任何疑问,请询问;如果需要其他代码部分,请询问。 Thanks :) 谢谢 :)

I was wondering how to update a JLabel when an item in a JList has been selected. 我想知道当在JList中选择一个项目时如何更新JLabel。

You will want to use a List Selecton Listener. 您将要使用列表选择监听器。 The section from the Swing tutorial on How to Write a List Selection Listener has some example code. Swing教程中有关如何编写列表选择侦听器的部分提供了一些示例代码。

There are other problems with your code: 您的代码还有其他问题:

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

This is not the way to swap panels. 这不是交换面板的方法。 It is far easier to use a Card Layout . 使用Card Layout要容易得多。 The Swing tutorial has a section on How to Use a Card Layout which contains an example. Swing教程包含有关How to Use a Card Layout卡布局的部分,其中包含一个示例。

The specific problems with the above code are: 上面的代码的特定问题是:

  1. Don't invoke doLayout(). 不要调用doLayout()。 That method is invoked by other Swing methods and you should not need to invoke it manually. 该方法由其他Swing方法调用,您无需手动调用它。

  2. Don't invoke update() and don't use getGraphics(). 不要调用update(),也不要使用getGraphics()。 Swing is smart enough to repaint itself when needed. Swing足够聪明,可以在需要时重新绘制自身。 However, there can be times when you can use repaint() to force a component to repaint itself. 但是,有时您可以使用repaint()强制组件重新绘制自身。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM