[英]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("");
我正在构建一个程序,该程序将在从JComboBox中选择“获得的总积分”旁边的名称后显示积分,我不知道如何使用
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. 但是我希望它显示在程序内部的“获得的总积分:”一词旁边的pointsEarned JTextField中,而不是在我的编译器框中。
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: 这是我的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";
}
}
Here's my ManageUsersGUI class: 这是我的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);
}
}
You appear to have a JTextField
, pointsEarned
, that seems to be what you want to use to print the values. 您似乎有一个
JTextField
, pointsEarned
,这似乎是您要用来打印值的东西。
If you take a look at the JavaDocs for JTextField
, you will find a setText
method which takes a String
如果你看看在JavaDoc中
JTextField
,你会发现一个setText
方法,它需要一个String
So, the problem really becomes, "how do you convert an int
to String
?". 因此,问题实际上变成了“如何将
int
转换为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())
}
}
}
So, after spending a bit of time with the code, a number of issues seem to have presented themselves. 因此,在花了一些时间使用代码之后,似乎已经出现了许多问题。
First, the reliance of static
一,对
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. static
不是跨对象通信机制,该信息应在需要时传递给ManageUsersGUI
的实例,或者应生成并返回列表,具体取决于您要实现的目标。
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 其次,仅用用户名填充
JComboBox
即可,并且可以通过多种方法对其进行管理,只是直接将User
对象添加到其中,这很简单,然后解决了发生的问题当两个具有相同名称的用户添加到列表中时
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
这意味着
addItem
将仅接受User
实例,而getSelectedItem
将返回User
而不是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. 只要
JComboBox
发生更改,它就应该从List
填充,而不是在弹出窗口可见时填充,您会发现用户体验会好得多。
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 更多细节
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.