我正在开发一个程序,要求我编写一个使用GUI的程序,允许用户输入他们的名字并推送"初始化"按钮开始程序的其余部分。在按下该按钮之前,应该禁用其余组件。之后,用户应该能够输入他们的类的名称,按下"添加"按钮,它们应该添加到JList中。他们还应该能够从JList中选择项目并按下"删除"按钮。但是,按下按钮时不会添加项目(因此我也不确定删除部分是否也不正确)。有谁看到导致这种情况的原因?
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());
}
}
}
}
答案 0 :(得分:1)
这绝不可行:if(e.getSource() == "initializeButton")
。 &#34;来源&#34;动作必须是可以接受ActionListener的Swing组件,例如JButton。它可以永远不会成为一个字符串。删除引号,以便将源与按钮本身进行比较,而不是完全不相关的字符串。
所以而不是
if(e.getSource() == "initializeButton")
做的:
if(e.getSource() == initializeButton)
关于studentPanel.setLayout(null);
虽然null布局和setBounds()
似乎可以像创建复杂GUI的最简单和最好的方式一样,但更多的Swing GUI会让您遇到更严重的困难。使用它们时当GUI调整大小时,他们不会调整组件的大小,他们是增强或维护的皇室女巫,当他们放置在滚动窗格中时,他们完全失败,当他们在所有平台或屏幕分辨率不同时看起来很糟糕原来的。一旦您必须维护或改进以这种方式创建的问题,您就会明白它是多么危险和脆弱。
例如,当我运行你的程序时,这就是我所看到的:
注意一些按钮和标签文本是如何被截断的 - 这是由于你使用空布局和setBounds
直接导致的,因为这种类型的GUI不知道如何为所有平台正确地扩展其组件正确使用布局管理器。