从我的 JComboBox 中选择一个名称后,如何让积分显示在我的程序中?

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

我正在构建一个程序,在从 "Total points earned" 旁边的 JComboBox 中选择名称后将显示这些点,我不知道如何使用 System.out.println(""); 但我想要它在程序内部显示 "Total points earned: " 字样旁边的 pointsEarned JTextField 不在我的编译器框中。

这是我的代码:

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

这是我的用户 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";
   }

} 

这是我的 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);
   }
}   

您似乎有一个 JTextFieldpointsEarned,这似乎是您想用来打印值的东西。

如果你看一下 JavaDocs for JTextField,你会发现一个 setText 方法需要 String

那么,问题就真的变成了,"how do you convert an int to String?"。那么有很多方法...

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

您将使用哪种取决于您想要实现的目标。

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())
        }
    }
}      

已更新

因此,在花一些时间编写代码后,似乎出现了一些问题。

一是static

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

static 不是跨对象通信机制,此信息应该在需要时传递给 ManageUsersGUI 的实例,或者它应该生成 return 列表,具体取决于你想要达到的目标。

其次,您只用用户名填充 JComboBox,虽然这可以做到并且有管理它的方法,但只添加 User 会更简单直接反对它,这就解决了当两个同名用户被添加到列表时会发生什么的问题

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

您还应该使用泛型来定义您的异常...

private JComboBox<User> userList;

这意味着 addItem 将只接受 User 的实例,而 getSelectedItem 将 return User 而不是 Object

List 发生变化时,JComboBox 应该从 List 填充,而不是当弹出窗口可见时,您会发现用户体验更好。

你也应该使用模态对话框,从用户那里收集少量信息,这将使你的代码在较长的时间里更易于管理 运行

看看:

了解更多详情