Java JButtons变灰/逻辑问题

Java JButtons变灰/逻辑问题,java,swing,jbutton,Java,Swing,Jbutton,我在第一节Java课上做投票程序作业。我几乎完成了,除了一个关于候选人选择的按钮的奇怪问题。在第一人称投票后,它们被禁用并变灰,就像窗口首次启动时一样。然后应该在第二个人登录后启用它们。然而,所有的按钮都被禁用了,但是看似随机的按钮不会显示为灰色,即使它们确实被禁用了。有时,其中一个或两个也会保留其红色文本颜色,当用户单击它们以选择其投票选择时,该颜色就会生效。我确实在不同的区域操纵它们,我猜这会导致一个我看不到的逻辑错误 考虑重写,在这样做的时候,把大部分代码从主方法中取出,从静态的领域,

我在第一节Java课上做投票程序作业。我几乎完成了,除了一个关于候选人选择的按钮的奇怪问题。在第一人称投票后,它们被禁用并变灰,就像窗口首次启动时一样。然后应该在第二个人登录后启用它们。然而,所有的按钮都被禁用了,但是看似随机的按钮不会显示为灰色,即使它们确实被禁用了。有时,其中一个或两个也会保留其红色文本颜色,当用户单击它们以选择其投票选择时,该颜色就会生效。我确实在不同的区域操纵它们,我猜这会导致一个我看不到的逻辑错误


考虑重写,在这样做的时候,把大部分代码从主方法中取出,从静态的领域,到它完全属于的实例领域。现在,看看它,我可以肯定地看到它,但它的到期日,我花了相当长的时间才能到达这个遥远的地方。哈哈,我衷心祝愿你好运,希望你能在截止日期前解决你的问题。
//import section
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.*;
import javax.swing.*;


public class Assig4 {


    public static void main (String [] args) throws IOException
    {

        /* variables */

        String ballotsFileName = args[0]; // gets the file name from command line
        JFrame theWindow; //assign variable name for main window
        ArrayList <Ballot> ballotsAr = new ArrayList<>(); //creates array for jpanel ballot objects
        ArrayList <Integer> numVotes = new ArrayList<>();
        int numBallots=0;
        int counter = 0; //to count each file read in loop
        JButton login, submitVote;
        //voter variables
        ArrayList <Integer> voterIdList = new ArrayList<>();
        ArrayList <String> voterNames = new ArrayList<>();
        ArrayList <Boolean> voterVoted = new ArrayList<>();

        /*create window*/

        theWindow = new JFrame ("Voting E Machine");
        theWindow.setLayout(new FlowLayout());
        theWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        /* read in ballot info and create ballot objects*/

        numBallots = readInBallotFile(ballotsFileName, numBallots, ballotsAr);

        /*read in data from voter file*/

        try {
            // method that accesses the file
            readInVoterFile(voterIdList, voterNames, voterVoted);
        }
        catch (Exception e)
        {}

        /*add local components*/
        submitVote = new JButton("Submit Vote(s)");
        submitVote.setEnabled(false);
        login = new JButton("Login");

        /*actionListener class to handle login and vote submissions*/

        class MListener implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                //if submitVote button is clicked
                if (ae.getSource() == submitVote)
                {
                    //confirm submission
                    int selectedOption;
                    selectedOption = JOptionPane.showConfirmDialog(null,"Confirm vote?","Choose",JOptionPane.YES_NO_OPTION);

                    if (selectedOption == JOptionPane.NO_OPTION)
                        JOptionPane.showMessageDialog(null, "Please review selection");
                    else if (selectedOption == JOptionPane.YES_OPTION)
                    {
                        //thank you message
                        JOptionPane.showMessageDialog(null, "Thank you for your vote!");
                        //loop through each ballot and each candidate to update total votes
                        for (int bb =0; bb < ballotsAr.size(); bb++)
                        {
                            for (int s =0; s <ballotsAr.get(bb).getNumCandidates(); s++)
                            {
                                if (ballotsAr.get(bb).getVoteCount(s) >0)
                                    ballotsAr.get(bb).addTotalNumVotes(s);
                            }
                        }

                        try {
                            // method that accesses the file
                            writeVoterFile(voterIdList, voterNames, voterVoted);
                        }
                        catch (Exception e)
                        {}
                        try {
                            // method that accesses the file
                            writeBallotResultsFiles(ballotsAr);
                        }
                        catch (Exception e)
                        {}

                        //reset voter machine
                        login.setEnabled(true);
                        submitVote.setEnabled(false);
                        for (int gg = 0; gg <ballotsAr.size(); gg++)
                        {
                            ballotsAr.get(gg).disableCandidateButtons();
                        }

                    }

                } //end of if source is submit vote button

                //if login button is clicked
                if (ae.getSource() == login)
                {
                    String userEntryIdString;
                    int userEntryId;
                    boolean registered=false;

                    do {
                        userEntryIdString = JOptionPane.showInputDialog(null, "Enter your voter ID number: ");
                        userEntryId = Integer.parseInt(userEntryIdString);
                        //check id number against registered citizens
                        for (int v =0; v < voterIdList.size(); v++)
                        {
                            if (userEntryId == voterIdList.get(v) && !voterVoted.get(v))
                            {
                                registered = true;
                                voterVoted.set(v,true);
                                login.setEnabled(false);
                                //print welcome message with name
                                JOptionPane.showMessageDialog(null, voterNames.get(v) + ", please make your choices");
                            }
                            else if (userEntryId == voterIdList.get(v) && voterVoted.get(v))
                                JOptionPane.showMessageDialog(null, "YOU HAVE ALREADY VOTED. If think this is an error precede.");
                        }   // end of loop to check id against id list

                        if (registered)
                        {
                            //enable buttons
                            for (int j = 0; j<ballotsAr.size(); j++)
                            {
                                ballotsAr.get(j).enableCandidateButtons();
                            }
                            submitVote.setEnabled(true);
                        }

                        else if (!registered)
                            System.out.println("Please try again. ");
                    } while (!registered);
                } //end of if login button is clicked
            } //end of action performed method

        }// end of actionlistener

        /*create action listener object */
        ActionListener listener2 = new MListener();

        /*add Ballot panels*/
        addPanels(theWindow, ballotsAr);

        /*assign components to actionlistener*/
        submitVote.addActionListener(listener2);
        login.addActionListener(listener2);

        /* Add local buttons to window */
        theWindow.add(login);
        theWindow.add(submitVote);

        /*pack and set window to visible*/

        theWindow.pack();
        theWindow.setVisible(true);

    }   //end of main

    public static int readInBallotFile(String ballotsFile, int numBallots, ArrayList<Ballot> ballotsAr) throws IOException
    {
        int counter = 0;
        //objects - open and setup scanner for file
        File myfile = new File (ballotsFile);
        Scanner textScan = new Scanner(myfile); // reads in date from text file
        numBallots = Integer.parseInt(textScan.nextLine()); //read in first line (number of ballots) and parse to int
        while (textScan.hasNextLine()) //one ballot's data for each loop
        {

            //read in each ballot's info
            //take the first line as a string
            String [] tempStr = textScan.nextLine().split(":");
            //parse line into proper data values
            int tempId = Integer.parseInt(tempStr[0]); //take first value for id
            String tempCategory = tempStr[1]; // take second value as category type
            String [] tempCandidates = tempStr[2].split(","); // takes the arbitrary number of candidates and splits into separate string variables

            //create ballot object
            ballotsAr.add(new Ballot(tempId,tempCategory,tempCandidates, ballotsFile));
            counter++; //adds counter to while loop
        }   // end of loop to read in ballot text file contents
        textScan.close(); //closes ballots.txt file
        return numBallots;
    }   //end of read in ballot file method

    public static void addPanels(JFrame theWindow, ArrayList <Ballot> ballotsAr)
    {
        for (int i =0; i<ballotsAr.size();i++)
        {
            theWindow.add(ballotsAr.get(i));
        }
    }

    public static void readInVoterFile(ArrayList <Integer> _voterIdList, ArrayList <String> _voterNames, ArrayList <Boolean> _voterVoted) throws IOException
    {
        int counter = 0;
        //objects - open and setup scanner for file
        File myfile = new File ("voters.txt");
        Scanner textScan = new Scanner(myfile); // reads in date from text file
        while (textScan.hasNextLine()) //one voter's data for each loop
        {
            //take the first line as a string
            String [] tempStr = textScan.nextLine().split(":");
            //parse line into proper data values
            _voterIdList.add(Integer.parseInt(tempStr[0]));  //take first value for voter id
            _voterNames.add(tempStr[1]); // take second value as voter name
            _voterVoted.add(Boolean.parseBoolean(tempStr[2]));
            counter++; //adds counter to while loop
        }   // end of loop to read in voter text file contents
        textScan.close(); //closes ballots.txt file
    } // end of voter read in method

    //update voter file local variables including false to true for voted
    //write data to temp file
    //delete original file
    //change temp file name to previous file name

    //create ballot files
    //reset voterprogram

    public static void writeVoterFile(ArrayList <Integer> voterIdList, ArrayList <String> voterNames, ArrayList <Boolean> voterVoted) throws IOException
    {
        PrintWriter outputFile = new PrintWriter("tempVotersFile.txt");
        for (int q = 0; q < voterIdList.size(); q++)
        {
            outputFile.print(voterIdList.get(q)+":");
            outputFile.print(voterNames.get(q)+":");
            String tempStrboolean = String.valueOf(voterVoted.get(q));
            if (q == voterIdList.size()-1) //avoid blank line at end of text file
                outputFile.print(tempStrboolean);
            else
                outputFile.println(tempStrboolean);
        }
        outputFile.close();

        //change temp file name to voters.txt
        File tempFile = new File ("tempVotersFile.txt");
        File originalFile = new File ("voters.txt");
        tempFile.renameTo(originalFile);
    }   //end of write voter method

    public static void writeBallotResultsFiles(ArrayList <Ballot> _ballotsAR) throws IOException
    {
        for (int h = 0; h <_ballotsAR.size(); h++)
        {
            String tempStr = String.valueOf(_ballotsAR.get(h).getId());
            PrintWriter outputFile = new PrintWriter(tempStr);
            for (int r = 0; r <_ballotsAR.get(h).getNumCandidates(); r++)
            {
                outputFile.print(_ballotsAR.get(h).getCandidateString(r)+":");
                outputFile.println(_ballotsAR.get(h).getTotalNumVotes(r));
            } //end of loop for number of candidates for each ballot
            outputFile.close();
        } // end of loop for each ballot

    }   // end of write ballot results method

} // end of class



//import section
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;


public class Ballot extends JPanel {

    //instance variables
    private int id;
    private JLabel categoryLabel;
    private String categoryS, ballotsFileName;
    private ArrayList <JButton> candidatesButton = new ArrayList<JButton>();
    private ArrayList<String> candidatesS = new ArrayList<String>();
    private int [] numVotes;
    private int [] totalNumVotes;  // total votes for all voters
    private boolean[] clicked;

    //constructor
    public Ballot(int _id,String _category,String [] _candidatesS, String _ballotsFileName)
    {
        //set variables
        id = _id;
        categoryS = _category;
        ballotsFileName = _ballotsFileName;
        for (int t= 0; t<_candidatesS.length; t++)
        {
            candidatesS.add(_candidatesS[t]);
        } //end of loop to copy array to arrayList
        categoryLabel = new JLabel(categoryS);
        numVotes = new int [candidatesS.size()];
        totalNumVotes = new int [candidatesS.size()];


        //align label
        categoryLabel.setHorizontalAlignment(SwingConstants.CENTER);
        //make bold
        Font f = categoryLabel.getFont();
        categoryLabel.setFont(f.deriveFont(f.getStyle() ^ Font.BOLD));

        // set layout for ballot panel
        setLayout(new GridLayout(candidatesS.size()+1,1));

        //add the category label to the panel
        add(categoryLabel);

        //create action listener object
        ActionListener listener = new BListener();

        //loop to create arbitrary number of candidate buttons
        clicked = new boolean[candidatesS.size()];
        for (int i = 0; i < candidatesS.size(); i++)
        {
            candidatesButton.add(new JButton(candidatesS.get(i)));
            clicked[i] = false;
            candidatesButton.get(i).addActionListener(listener);
            add(candidatesButton.get(i));
            candidatesButton.get(i).setEnabled(false);
        } // end of loop
    }   //end of ballot constructor

    //method to return click status
    public boolean getStatusClicked(int i)
    {
        return clicked[i];
    }

    //accessor methods
    public String getCategoryS() {return categoryS;}
    public String getCandidateString(int i) {return candidatesS.get(i);} //not right
    public int getNumCandidates() {return candidatesButton.size();}
    public int getId() {return id;}
    public int getVoteCount(int i) {return numVotes[i];}
    public int getTotalNumVotes (int i) {return totalNumVotes[i];}

    //mutator methods
    public void enableCandidateButtons()
    {
        for (int g = 0; g<candidatesS.size(); g++)
        {
            candidatesButton.get(g).setEnabled(true);
        }
    }
    public void disableCandidateButtons() //disable and reset buttons after one person votes
    {
        for (int g = 0; g<candidatesS.size(); g++)
        {
            candidatesButton.get(g).setEnabled(false);
            clicked[g] = false;
            candidatesButton.get(g).setForeground(Color.BLACK);
        }
    }

    public void addTotalNumVotes(int i) {totalNumVotes[i]++;}
    //listener to toggle the status of buttons when clicked
    private class BListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            int i = 0; //counter variable for arraylist calls
            for (JButton b: candidatesButton) //change to REGULAR FOR LOOP??
            {
                if (e.getSource() == candidatesButton.get(i))
                {
                    clicked[i] = !clicked[i];
                    if (clicked[i])
                    {
                        candidatesButton.get(i).setForeground(Color.RED);
                        numVotes[i]++;
                        //JOptionPane.showMessageDialog(null,numVotes[i]); debugging option to check vote count

                    }

                    else if (!clicked[i])
                    {
                        candidatesButton.get(i).setForeground(Color.BLACK);
                        numVotes[i]--;
                    }
                } // end of if get source is
                else
                {
                    candidatesButton.get(i).setForeground(Color.BLACK);
                    clicked[i] =false;
                    numVotes[i] = 0;
                }

                i++; //increment int counter
            } // end of cycle through all buttons
        } // end of actionperformed
    } //end of listener



} // end of ballot class