无法获取要添加到JList的用户的项目

时间:2017-07-15 17:48:23

标签: java swing user-interface jlist

我正在开发一个程序,要求我编写一个使用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());
        }

        }

    }

    }

1 个答案:

答案 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调整大小时,他们不会调整组件的大小,他们是增强或维护的皇室女巫,当他们放置在滚动窗格中时,他们完全失败,当他们在所有平台或屏幕分辨率不同时看起来很糟糕原来的。一旦您必须维护或改进以这种方式创建的问题,您就会明白它是多么危险和脆弱。

例如,当我运行你的程序时,这就是我所看到的:

enter image description here

注意一些按钮和标签文本是如何被截断的 - 这是由于你使用空布局和setBounds直接导致的,因为这种类型的GUI不知道如何为所有平台正确地扩展其组件正确使用布局管理器。