无法将用户的项目添加到 JList
Can't Get User's Items to Add to JList
我正在开发一个程序,该程序要求我编写一个程序,该程序使用 GUI 允许用户输入他们的姓名并按下 "initialize" 按钮以开始程序的其余部分。在按下该按钮之前,其余组件应该被禁用。之后,用户应该能够输入他们的 类 的名字,按下 "add" 按钮,他们应该被添加到 JList 中。他们还应该能够从 JList 中 select 项目,并通过按 "remove" 按钮删除它们。但是,按下按钮时不会添加项目(所以我也不确定删除部分是否也不正确)。有人知道是什么原因造成的吗?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
public class ClassSchedule extends JFrame {
private JTextField nameField;
private JTextField classField;
private DefaultListModel<String> dlm;
private JList<String> list;
private JLabel nameLabel;
private JButton initializeButton;
private JButton addClassButton;
private JList list_1;
private JScrollPane scrollPane;
private JButton removeClassButton;
public ClassSchedule() {
getContentPane().setLayout(new BorderLayout(0, 0));
getContentPane().setBounds(400, 400, 800, 800);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel studentPanel = new JPanel();
studentPanel.setBorder(new TitledBorder(new
BevelBorder(BevelBorder.LOWERED, null, null, null, null), "Add Student's
Name", TitledBorder.LEADING, TitledBorder.TOP, null, null));
getContentPane().add(studentPanel, BorderLayout.WEST);
studentPanel.setLayout(null);
nameLabel = new JLabel("Student's Name: ");
nameLabel.setBounds(10, 73, 82, 14);
studentPanel.add(nameLabel);
nameField = new JTextField();
nameField.setText("a name");
nameField.setBounds(102, 70, 86, 20);
studentPanel.add(nameField);
nameField.setColumns(10);
initializeButton = new JButton("Initialize");
initializeButton.setBounds(99, 147, 89, 23);
studentPanel.add(initializeButton);
JPanel classesPanel = new JPanel();
classesPanel.setBorder(new TitledBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null), "Add, Delete, or Clear Classes", TitledBorder.LEADING, TitledBorder.TOP, null, null));
getContentPane().add(classesPanel, BorderLayout.EAST);
classesPanel.setLayout(null);
classField = new JTextField();
classField.setEnabled(false);
classField.setBounds(10, 38, 86, 20);
classesPanel.add(classField);
classField.setColumns(10);
addClassButton = new JButton("Add Class");
addClassButton.setEnabled(false);
addClassButton.setBounds(118, 37, 89, 23);
classesPanel.add(addClassButton);
classesPanel.setPreferredSize(new Dimension (220, 200));
studentPanel.setPreferredSize(new Dimension (220,200));
dlm = new DefaultListModel<>();
list = new JList<>(dlm);
list_1 = new JList();
list_1.setEnabled(false);
classesPanel.add(list_1);
list_1.setBorder(new LineBorder(new Color(0, 0, 0)));
list_1.setVisibleRowCount(6);
scrollPane = new JScrollPane(list_1);
scrollPane.setEnabled(false);
classesPanel.add(scrollPane);
scrollPane.setBounds(10, 106, 197, 60);
removeClassButton = new JButton("Remove Selected Class");
removeClassButton.setEnabled(false);
removeClassButton.setBounds(31, 207, 158, 23);
classesPanel.add(removeClassButton);
JMenuBar menuBar = new JMenuBar();
getContentPane().add(menuBar, BorderLayout.NORTH);
//register all the listeners
ButtonHandler bh = new ButtonHandler();
initializeButton.addActionListener(bh);
addClassButton.addActionListener(bh);
removeClassButton.addActionListener(bh);
}
//listener method for the buttons
class ButtonHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
String name;
String classes;
//when a name is entered and initialize is pressed, store the name in a variable "name", enable the other components, and disable
//initialize components
if(e.getSource() == initializeButton)
{
name = nameField.getText();
nameField.setEnabled(false);
initializeButton.setEnabled(false);
classField.setEnabled(true);
addClassButton.setEnabled(true);
removeClassButton.setEnabled(true);
scrollPane.setEnabled(true);
list.setEnabled(true);
}
//when a class is entered and add class is pressed, add the name to the list
if(e.getSource() == addClassButton)
{
dlm.addElement(classField.getText());
}
//when a class(es) from the list is selected and remove is pressed, remove the items from the list
if(e.getSource() == removeClassButton)
{
list.remove(list.getSelectedIndex());
}
}
}
}
这永远行不通:if(e.getSource() == "initializeButton")
。动作的 "source" 必须是可以接受 ActionListener 的 Swing 组件,例如 JButton。它 永远不会 是字符串。去掉引号,以便将源与按钮本身进行比较,而不是与完全不相关的字符串进行比较。
所以
if(e.getSource() == "initializeButton")
做:
if(e.getSource() == initializeButton)
与 studentPanel.setLayout(null);
无关的问题
虽然空布局和 setBounds()
对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但您创建的 Swing GUI 越多,您在使用时 运行 遇到的困难就越严重他们。它们不会在 GUI 调整大小时调整您的组件的大小,它们是皇家 来增强或维护的,当放置在滚动窗格中时它们完全失败,当在所有平台或不同的屏幕分辨率上查看时它们看起来很糟糕从原来的。一旦您不得不维护或改进以这种方式创建的问题,您就会明白它是多么危险和脆弱。
例如,当我运行你的程序时,我看到的是这样的:
请注意一些按钮和标签文本是如何被截断的——这直接是由于您使用了空布局,并且 setBounds
因为这种类型的 GUI 不知道如何为所有组件正确缩放其组件平台,同时正确使用布局管理器。
我正在开发一个程序,该程序要求我编写一个程序,该程序使用 GUI 允许用户输入他们的姓名并按下 "initialize" 按钮以开始程序的其余部分。在按下该按钮之前,其余组件应该被禁用。之后,用户应该能够输入他们的 类 的名字,按下 "add" 按钮,他们应该被添加到 JList 中。他们还应该能够从 JList 中 select 项目,并通过按 "remove" 按钮删除它们。但是,按下按钮时不会添加项目(所以我也不确定删除部分是否也不正确)。有人知道是什么原因造成的吗?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
public class ClassSchedule extends JFrame {
private JTextField nameField;
private JTextField classField;
private DefaultListModel<String> dlm;
private JList<String> list;
private JLabel nameLabel;
private JButton initializeButton;
private JButton addClassButton;
private JList list_1;
private JScrollPane scrollPane;
private JButton removeClassButton;
public ClassSchedule() {
getContentPane().setLayout(new BorderLayout(0, 0));
getContentPane().setBounds(400, 400, 800, 800);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel studentPanel = new JPanel();
studentPanel.setBorder(new TitledBorder(new
BevelBorder(BevelBorder.LOWERED, null, null, null, null), "Add Student's
Name", TitledBorder.LEADING, TitledBorder.TOP, null, null));
getContentPane().add(studentPanel, BorderLayout.WEST);
studentPanel.setLayout(null);
nameLabel = new JLabel("Student's Name: ");
nameLabel.setBounds(10, 73, 82, 14);
studentPanel.add(nameLabel);
nameField = new JTextField();
nameField.setText("a name");
nameField.setBounds(102, 70, 86, 20);
studentPanel.add(nameField);
nameField.setColumns(10);
initializeButton = new JButton("Initialize");
initializeButton.setBounds(99, 147, 89, 23);
studentPanel.add(initializeButton);
JPanel classesPanel = new JPanel();
classesPanel.setBorder(new TitledBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null), "Add, Delete, or Clear Classes", TitledBorder.LEADING, TitledBorder.TOP, null, null));
getContentPane().add(classesPanel, BorderLayout.EAST);
classesPanel.setLayout(null);
classField = new JTextField();
classField.setEnabled(false);
classField.setBounds(10, 38, 86, 20);
classesPanel.add(classField);
classField.setColumns(10);
addClassButton = new JButton("Add Class");
addClassButton.setEnabled(false);
addClassButton.setBounds(118, 37, 89, 23);
classesPanel.add(addClassButton);
classesPanel.setPreferredSize(new Dimension (220, 200));
studentPanel.setPreferredSize(new Dimension (220,200));
dlm = new DefaultListModel<>();
list = new JList<>(dlm);
list_1 = new JList();
list_1.setEnabled(false);
classesPanel.add(list_1);
list_1.setBorder(new LineBorder(new Color(0, 0, 0)));
list_1.setVisibleRowCount(6);
scrollPane = new JScrollPane(list_1);
scrollPane.setEnabled(false);
classesPanel.add(scrollPane);
scrollPane.setBounds(10, 106, 197, 60);
removeClassButton = new JButton("Remove Selected Class");
removeClassButton.setEnabled(false);
removeClassButton.setBounds(31, 207, 158, 23);
classesPanel.add(removeClassButton);
JMenuBar menuBar = new JMenuBar();
getContentPane().add(menuBar, BorderLayout.NORTH);
//register all the listeners
ButtonHandler bh = new ButtonHandler();
initializeButton.addActionListener(bh);
addClassButton.addActionListener(bh);
removeClassButton.addActionListener(bh);
}
//listener method for the buttons
class ButtonHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
String name;
String classes;
//when a name is entered and initialize is pressed, store the name in a variable "name", enable the other components, and disable
//initialize components
if(e.getSource() == initializeButton)
{
name = nameField.getText();
nameField.setEnabled(false);
initializeButton.setEnabled(false);
classField.setEnabled(true);
addClassButton.setEnabled(true);
removeClassButton.setEnabled(true);
scrollPane.setEnabled(true);
list.setEnabled(true);
}
//when a class is entered and add class is pressed, add the name to the list
if(e.getSource() == addClassButton)
{
dlm.addElement(classField.getText());
}
//when a class(es) from the list is selected and remove is pressed, remove the items from the list
if(e.getSource() == removeClassButton)
{
list.remove(list.getSelectedIndex());
}
}
}
}
这永远行不通:if(e.getSource() == "initializeButton")
。动作的 "source" 必须是可以接受 ActionListener 的 Swing 组件,例如 JButton。它 永远不会 是字符串。去掉引号,以便将源与按钮本身进行比较,而不是与完全不相关的字符串进行比较。
所以
if(e.getSource() == "initializeButton")
做:
if(e.getSource() == initializeButton)
与 studentPanel.setLayout(null);
虽然空布局和 setBounds()
对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但您创建的 Swing GUI 越多,您在使用时 运行 遇到的困难就越严重他们。它们不会在 GUI 调整大小时调整您的组件的大小,它们是皇家 来增强或维护的,当放置在滚动窗格中时它们完全失败,当在所有平台或不同的屏幕分辨率上查看时它们看起来很糟糕从原来的。一旦您不得不维护或改进以这种方式创建的问题,您就会明白它是多么危险和脆弱。
例如,当我运行你的程序时,我看到的是这样的:
请注意一些按钮和标签文本是如何被截断的——这直接是由于您使用了空布局,并且 setBounds
因为这种类型的 GUI 不知道如何为所有组件正确缩放其组件平台,同时正确使用布局管理器。