0

I was wondering how to update a JLabel when an item in a JList has been selected. 这将是一个游戏,它是游戏的库存面板。我希望它显示已选择的特定项目的 itemName。在播放器类中,这里是变量声明:

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: 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);
}

任何帮助都非常感谢,因为我已经搜索了几十个论坛试图找到答案。如果您有任何问题,请询问,如果您需要其他代码部分,请询问。谢谢 :)

4

1 回答 1

2

I was wondering how to update a JLabel when an item in a JList has been selected.

您将需要使用 List Selecton 侦听器。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() 强制组件重新绘制自身。

于 2013-10-24T03:14:10.897 回答