繁体   English   中英

从JComboBox中选择一个名称后,如何获得积分显示在程序上?

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

我正在构建一个程序,该程序将在从JComboBox中选择“获得的总积分”旁边的名称后显示积分,我不知道如何使用System.out.println(""); 但是我希望它显示在程序内部的“获得的总积分:”一词旁边的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();
    }
}

这是我的User类:

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类:

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 ,这似乎是您要用来打印值的东西。

如果你看看在JavaDoc中JTextField ,你会发现一个setText方法,它需要一个String

因此,问题实际上变成了“如何将int转换为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的实例,或者应生成并返回列表,具体取决于您要实现的目标。

其次,仅用用户名填充JComboBox即可,并且可以通过多种方法对其进行管理,只是直接将User对象添加到其中,这很简单,然后解决了发生的问题当两个具有相同名称的用户添加到列表中时

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

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

private JComboBox<User> userList;

这意味着addItem将仅接受User实例,而getSelectedItem将返回User而不是Object

只要JComboBox发生更改,它就应该从List填充,而不是在弹出窗口可见时填充,您会发现用户体验会好得多。

您还应该利用模式对话框,从用户那里收集少量信息,从长远来看,这将使您的代码更易于管理。

看一下:

更多细节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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