【问题标题】:How to move index of array by one with each click of button?每次单击按钮时如何将数组的索引移动一个?
【发布时间】:2012-03-24 15:51:23
【问题描述】:

我正在尝试制作一个带有“新游戏”按钮的程序,当按下该按钮时会询问用户一个新问题。这是一个关于州首府的问题,我希望每个新游戏都只更改问题中的州名。这可能是一种愚蠢的方法,但我只是在尝试并尝试了解更多关于 java 的信息。

我的问题是它只能工作一次。我按下新游戏,它第一次改变了,然后它什么也没做。我尝试过使用 while 和 for 循环的各种组合,但没有运气。有时,当我尝试在 for 循环的某种组合中使用 counter++ 时,程序甚至崩溃了!所以,是的,我很困惑,所以非常感谢。

主要

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args){

        Gui a = new Gui();

        List<String> stateList = new ArrayList<String>();
        List<String> capsList = new ArrayList<String>();

        for(String x: StateData.states)
            stateList.add(x);

        for(String z: StateData.caps)
            capsList.add(z);
    }
}

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Gui extends JFrame {
    private static final long serialVersionUID = 1L;

    JLabel instructions = new JLabel("What is the capital of Alabama?");

    JLabel aLabel = new JLabel("Answer: ");
    JTextField aField = new JTextField(16);

    JLabel result = new JLabel();

    JButton submit = new JButton("Submit");
    JButton reset = new JButton("Reset");
    JButton ng = new JButton("New Game");

    final Random rand = new Random();
    final int randPairNo = rand.nextInt(50);

    final Rng rngOb1 = new Rng();

    final int[] shuffList = rngOb1.numFinder();

    public Gui() {

        super("State Capitals Game");
        setLookAndFeel();
        setSize(325, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setResizable(false);

        setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        gc.insets = new Insets(5, 5, 5, 5);

        gc.gridx = 0;
        gc.gridy = 0;
        add(instructions, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        add(aLabel, gc);

        gc.gridx = 0;
        gc.gridy = 2;
        add(aField, gc);

        gc.gridx = 0;
        gc.gridy = 3;
        add(result, gc);

        gc.gridwidth = 3;
        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.gridx = 0;
        gc.gridy = 4;
        add(submit, gc);

        submit.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                String userIP = aField.getText();

                String mg = StateData.caps[randPairNo];

                if (userIP.equalsIgnoreCase(mg)) {
                    result.setText("That's correct!");
                } else {
                    result.setText("Sorry, that's incorrect.");
                }

            }
        });

        gc.gridwidth = 3;
        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.gridx = 0;
        gc.gridy = 5;
        add(reset, gc);

        reset.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                aField.setText("");
            }
        });

        gc.gridwidth = 3;
        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.gridx = 0;
        gc.gridy = 6;
        add(ng, gc);


//This is the new game button I'm trying to get to work.

        ng.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int counter = 0;

                if (counter < shuffList.length) {
                    instructions.setText("What is the capital of "
                            + StateData.states[shuffList[counter]] + "?");
                    counter++;
                } else {
                    counter = 0;
                }


            }
        });
    }

    private void setLookAndFeel() {

        try {
            UIManager
                    .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception exc) {
            // ignore error
        }

    }

}

Rng

import java.util.Random;

public class Rng {


    int[] numFinder() {

         int[] list = new int[50];
        for (int i = 0; i < list.length; i++) {
            list[i] = i;
        }

        Random rgen = new Random();

        for (int i = 0; i < list.length; i++) {
            int rnd = rgen.nextInt(list.length);
            int temp = list[i];
            list[i] = list[rnd];
            list[rnd] = temp;
        }

        return list;
    }
}

状态数据

public class StateData {

    public static String[] states = {"Alabama", "Alaska", "Arizona", "Arkansas", "California", 
            "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii",
            "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisianna",
            "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi",
            "Missouri", "Montana", "Nebraska", "Nevada", "New Hampsire", "New Jersey",
            "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma",
            "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota",
            "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia",
            "Winsconsin", "Wyoming" };

    public static String [] caps = {"Montgomery", "Juneau", "Pheonix", "Little Rock", "Sacremento", "Denver",
            "Hartford", "Dover", "Talahasee", "Atlanta", "Honolulu", "Boise", "Springfield", "Idianapolis",
            "Des Moines", "Topka", "Franfort", "Baton Rouge", "Augusta", "Annapolis", "Boston", "Lansing",
            "St Paul", "Jackson", "Jefferson City", "Helena", "Lincoln", "Carson City", "Concord",
            "Trenton", "Santa Fe", "Albany", "Raleigh", "Bismarck", "Columbus", "Oklahama City",
            "Salem", "Harrisburg", "Providence", "Columbia", "Pierre", "Nashville", "Austin", "Salt Lake City",
            "Montpelier", "Richmond", "Olympia", "Charleston", "Madison", "Cheyenne"};

}

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布一个 SSCCE(而不是 4 个单独的公共课程)。

标签: java arrays swing jbutton


【解决方案1】:

您的问题似乎出在 ActionListener 上。你有

public void actionPerformed(ActionEvent e) {
    int counter = 0;

这将在每次按下按钮时重置计数器。与你的描述一致。

在你的 Gui 类中声明 counter 作为一个字段,你应该没问题。

【讨论】:

  • @Matt 不客气。您可以接受问题的答案,并使用复选标记将其标记为已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
相关资源
最近更新 更多