【问题标题】:Can't Get User's Items to Add to JList无法将用户的项目添加到 JList
【发布时间】:2017-12-20 15:01:50
【问题描述】:

我正在编写一个程序,该程序需要我编写一个程序,该程序使用 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) 为了尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。 2) 请参阅Detection/fix for the hanging close bracket of a code block 了解我无法再费心解决的问题。
  • @AndrewThompson 感谢您的提示!我已经相应地调整了我的问题。如果您现在可以再看一下它,我将非常感激,因为它更具可读性。
  • @AndrewThompson:并且已经使答案无效
  • @HovercraftFullOfEels 我觉得应该回滚编辑,但我会让您自行决定。 OP:不要完全改变问题!要么将当前问题的答案标记为正确,要么删除整个问题。就新问题提出一个新问题(在单独的线程上)。
  • @AndrewThompson 哦,对不起,伙计们。这是我在这里提出的第一个问题。我不会再犯那个错误了。有没有办法撤消我所做的更改?

标签: java swing user-interface jlist


【解决方案1】:

这永远行不通:if(e.getSource() == "initializeButton")。动作的“来源”必须是可以接受 ActionListener 的 Swing 组件,例如 JButton。它可以永远是字符串。去掉引号,以便将源与按钮本身进行比较,而不是与完全不相关的字符串进行比较。

所以不是

if(e.getSource() == "initializeButton")

做:

if(e.getSource() == initializeButton)

studentPanel.setLayout(null);无关的问题

虽然空布局和setBounds() 在 Swing 新手看来是创建复杂 GUI 的最简单和最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整您的组件大小,它们是增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始不同的所有平台或屏幕分辨率上查看时它们看起来很糟糕.一旦你不得不维护或改进以这种方式创建的问题,你就会明白它是多么危险和脆弱。

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

注意一些按钮和标签文本是如何被截断的——这直接是由于您使用了空布局和setBounds,因为这种类型的 GUI 不知道如何在正确使用时为所有平台正确缩放其组件的布局管理器将。

【讨论】:

  • 好吧,我实际上只是使用 Window Builder 编辑器来设置布局和所有这些东西,所以我实际上不知道如何改变它。我一直在按照我的教授的方式进行操作,他总是以这样的方式启动他的 GUI。你建议我做什么?另外,我进行了您指出的编辑,现在我的程序的第一步可以工作,但添加类按钮没有。你能看看为什么会这样吗?
  • @Brooklyn:我相信你最好学习和使用布局管理器。您可以在此处找到布局管理器教程:Layout Manager Tutorial,您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 2019-05-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多