简体   繁体   中英

How do I get points to show up on my program after selecting a name from my JComboBox?

I'm building a program that will display the points after a name is selected from the JComboBox next to "Total points earned" & I don't know how to except use System.out.println(""); But I want it to show inside the program in the pointsEarned JTextField next to the words "Total points earned: " not in my compiler box.

Here are my codes:

import java.awt.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.*;
import java.awt.event.*;

public class UserHistory extends JPanel {
    private JLabel jcomp1;
    private JComboBox userList;
    private JLabel jcomp5;
    private JTextField pointsEarned;
    private JLabel jcomp7;
    private JList choresCompleted;

    public UserHistory() {        
        //construct preComponents
        ManageUsersGUI list = new ManageUsersGUI();
        String[] userListItems = new String[list.users.size()];
        String[] choresCompletedItems = {"Item 1", "Item 2", "Item 3"};

        //construct components
        jcomp1 = new JLabel ("User History");
        userList = new JComboBox(userListItems);

        userList.addPopupMenuListener(new PopupMenuListener() {
            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                userList.removeAllItems();
                for (User user: list.users) {
                    userList.addItem(user.getUserName());
                }   
            }

            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
            }

            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {
            }
        });

        jcomp5 = new JLabel ("Total points earned: ");
        pointsEarned = new JTextField ();
        userList.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
               myBox(e);
            }
        });     


        jcomp7 = new JLabel ("List of chores completed: ");
        choresCompleted = new JList (choresCompletedItems);

        //set components properties
        userList.setToolTipText ("Select a user");

        //adjust size and set layout
        setPreferredSize (new Dimension (465, 343));
        setLayout (null);

        //add components
        add (jcomp1);
        add (userList);
        add (jcomp5);
        add (pointsEarned);
        add (jcomp7);
        add (choresCompleted);

        //set component bounds (only needed by Absolute Positioning)
        jcomp1.setBounds (120, 20, 70, 25);
        userList.setBounds (210, 20, 100, 25);
        jcomp5.setBounds (125, 105, 140, 25);
        pointsEarned.setBounds (245, 105, 100, 25);
        jcomp7.setBounds (95, 140, 160, 25);
        choresCompleted.setBounds (245, 145, 100, 75);
    }

    protected void myBox(ActionEvent e) {
        if(userList.getSelectedItem() != null) {
            //System.out.println(User.getPoints());
        }
    }        

    public static void main (String[] args) {
        JFrame frame = new JFrame ("UserHistory");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add (new UserHistory());
        frame.pack();
        frame.setVisible (true);

        ManageUsersGUI.manageUsers();
    }
}

Here's my User class:

public class User {
   private String userName;
   private int points = 0;

   public User(String userName) {
      this.userName = userName;
   }

   public User() {
      userName = "";
   }   

   public void setUserName(String userName) {
      this.userName = userName;   
   }

   public String getUserName() {
      return userName;
   }

   public void addPoints(int chorePoints) {
      points += chorePoints;
   }

   public int getPoints() {
      return points;
   }

   public String toString() {
      return userName + "\n";
   }

} 

Here's my ManageUsersGUI class:

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

public class ManageUsersGUI extends JPanel {
   public static ArrayList<User> users = new ArrayList<>();

   private final JLabel addNewUserLabel;
   private final JTextField addNewUserTextField;
   private final JLabel deleteUsersLabel;
   private final JButton addButton;
   private final JButton deleteButton;
   private final JPanel namePanel;

    /**
     *
     */
    public ManageUsersGUI() {
       //construct components
       addNewUserLabel = new JLabel ("Add new User here:");
       addNewUserTextField = new JTextField (0);
       deleteUsersLabel = new JLabel ("Select which User(s) you would like to delete:");
       addButton = new JButton ("Add");
       deleteButton = new JButton ("Delete");
       namePanel = new JPanel();
       namePanel.setLayout(new BoxLayout(namePanel, BoxLayout.Y_AXIS));

       //set components properties
       addNewUserTextField.setToolTipText ("Enter name and click on Add button.");
       addButton.setToolTipText ("Click here to Add new user.");
       deleteButton.setToolTipText ("Click here to delete User(s) selected.");

       //adjust size and set layout
       setPreferredSize (new Dimension (580, 485));
       setLayout (null);

       //add components
       add (addNewUserLabel);
       add (addNewUserTextField);
       add (deleteUsersLabel);
       add (namePanel);
       add (addButton);
       add (deleteButton);

       //set component bounds (only needed by Absolute Positioning)
       addNewUserLabel.setBounds (85, 130, 120, 25);
       addNewUserTextField.setBounds (235, 130, 125, 25);
       deleteUsersLabel.setBounds (135, 225, 281, 25);
       addButton.setBounds (385, 130, 100, 25);
       namePanel.setBounds(225, 270, 140, 0);
       deleteButton.setBounds (230, 335, 100, 25);

       addButton.addActionListener(new AddButtonListener());

       deleteButton.addActionListener(new DeleteButtonListener());
   }

    /**
     *
     * @return
     */
    public ArrayList<User> getUser() {
              return users;
           }        

   private class AddButtonListener implements ActionListener {
       @Override
       public void actionPerformed(ActionEvent e) {
           String text = addNewUserTextField.getText();
           users.add(new User(text));

           // Display the changes.
           JOptionPane.showMessageDialog(null, text + " has been added.");

           JCheckBox nameCheckBox = new JCheckBox();
           nameCheckBox.setText(addNewUserTextField.getText());
           namePanel.add(nameCheckBox);
           namePanel.setBounds(225, 270, 140, namePanel.getHeight() + 25);
           deleteButton.setBounds(230, deleteButton.getY() + 25, 100, 25);
           JFrame frame = (JFrame) getRootPane().getParent();
           frame.setSize(frame.getWidth(), frame.getHeight() + 25);
           frame.pack(); 

       }
   }

   private class DeleteButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
           for(Component component : namePanel.getComponents()) {
              if(component instanceof JCheckBox) {
                 if(((JCheckBox)component).isSelected())
                    namePanel.remove(component);
              }
           }
           namePanel.revalidate();
           namePanel.repaint();
        }   
   }


   public static void main (String[] args) {
       JFrame frame = new JFrame ("AddUsersPanel");
       frame.setTitle("Manage Users");
       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
       frame.getContentPane().add (new ManageUsersGUI());
       frame.pack();
       frame.setVisible (true);
   }

   // in ManageUsersGUI
   public static void manageUsers() {
       JFrame frame = new JFrame ("AddUsersPanel1");
       frame.setTitle("Manage Users");
       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
       frame.getContentPane().add (new ManageUsersGUI());
       frame.pack();
       frame.setVisible (true);
   }
}   

You appear to have a JTextField , pointsEarned , that seems to be what you want to use to print the values.

If you take a look at the JavaDocs for JTextField , you will find a setText method which takes a String

So, the problem really becomes, "how do you convert an int to String ?". Well there a lots of ways...

  • Integer.toString
  • String.valueOf
  • NumberFormat.getNumberInstance
  • "" + intValue

Which you would use would depend on what you want to achieve.

protected void myBox(ActionEvent e) {
    Object obj = userList.getSelectedItem();
    if(obj != null) {
        if (obj instanceof User) {
            User user = (User)obj;
            pointsEarned.setText(NumberFormat.getNumberInstance().format(user.getPoints())
        }
    }
}      

Updated

So, after spending a bit of time with the code, a number of issues seem to have presented themselves.

First, the reliance of static

public class ManageUsersGUI extends JPanel {
    public static ArrayList<User> users = new ArrayList<>();

static is NOT a cross object communication mechanism, this information should either be passed to an instance of ManageUsersGUI when required or it should generate and return the list, depending on what you want to achieve.

Second, you are populating the JComboBox with just the name of the users, while this can be done and there are ways to manage it, it would be simper to just add the User object to it directly, this then solves the issue of what happens when two user's with the same name are added to the list

for (User user: list.users) {
    userList.addItem(user);
}   

You should also make user of generics to define your exceptions...

private JComboBox<User> userList;

This means that addItem will only accept instances of User and getSelectedItem will return User instead of Object

The JComboBox should populate from the List when ever it changes, not when the popup is made visible, you will find the user experience a much nicer one.

You should make use of modal dialogs as well, to gather small amounts of information from the user, this will make you code more manageable in the long run

Have a look at:

for more details

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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