【问题标题】:How do I add JCheckBox next to each name that has been entered into an arraylist from a JTextField?如何在从 JTextField 输入到数组列表中的每个名称旁边添加 JCheckBox?
【发布时间】:2016-02-26 11:10:43
【问题描述】:

我正在创建一个如下所示的 ManageUsers GUI:

我希望复选框位于从“添加新用户”部分输入的列表中的名称旁边。我知道其中大部分还没有完成,但这是我目前所拥有的:

添加用户

public class AddUsers {

   private String userName;

   public AddUsers(String userName) {
      this.userName = userName;
   }

   public AddUsers() {
      userName = "";
   }   

   public void setUserName(String userName) {
      this.userName = userName;   
   }

   public String getUserName() {
      return userName;
   }

   public String toString() {
      return userName + "\n";
   }

}      

管理用户界面

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.awt.TextField;


public class ManageUsersGUI1 extends JPanel {
    public static ArrayList<AddUsers> users = new ArrayList<>();

    private JLabel addNewUserLabel;
    private JTextField addNewUserTextField;
    private JLabel deleteUsersLabel;
    private JCheckBox jcomp4;
    private JCheckBox jcomp5;
    private JCheckBox jcomp6;
    private JButton addButton;
    private JButton deleteButton;

    public ManageUsersGUI1() {         
        //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:");
        jcomp4 = new JCheckBox ("newCheckBox");
        jcomp5 = new JCheckBox ("newCheckBox");
        jcomp6 = new JCheckBox ("newCheckBox");
        addButton = new JButton ("Add");
        deleteButton = new JButton ("Delete");

        //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 (jcomp4);
        add (jcomp5);
        add (jcomp6);
        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);
        jcomp4.setBounds (225, 270, 140, 25);
        jcomp5.setBounds (225, 300, 140, 25);
        jcomp6.setBounds (225, 330, 140, 25);
        addButton.setBounds (385, 130, 100, 25);
        deleteButton.setBounds (230, 410, 100, 25);

        addButton.addActionListener(new AddButtonListener());

    }

    private class AddButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
           String text = addNewUserTextField.getText();
           users.add(new AddUsers(text));

           // Display the charges.
           JOptionPane.showMessageDialog(null, text + " has been added.");
        }
   }


    public static void main (String[] args) {
        JFrame frame = new JFrame ("AddUsersPanel1");
        frame.setTitle("Manage Users");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add (new ManageUsersGUI1());
        frame.pack();
        frame.setVisible (true);
    }
}

【问题讨论】:

  • 您是否考虑过在点击侦听器上动态添加复选框?在 Android 中,您可以动态添加复选框视图并设置其标题和 ID,然后使用它来引用相关数据...
  • 很遗憾我不会在 Android 上使用这个程序。这只是一个将在桌面上运行的简短项目。 @FrankBrenyah
  • 我的意思是它仍然是 Java 并且仍然存在侦听器,并且仍然存在复选框,并且您可以在事件回调上动态添加复选框(例如按下按钮)。这里的问题是我不确定如何在你想要的地方准确地绘制它......但我相信你可以解决这个问题。

标签: java user-interface arraylist jtextfield jcheckbox


【解决方案1】:

您可以使用JPanelBoxLayout 作为布局管理器。

这样,对于在JTextField 中输入的每个新名称,您都可以在JPanel 中添加一个新的JCheckBox,它会自动将它们按垂直顺序排列。

我已对您的代码进行了一些修改以举例说明,因此您可以根据自己的需要进行调整:

public class ManageUsersGUI1 extends JPanel {
    public static ArrayList<AddUsers> users = new ArrayList<>();

    private JLabel addNewUserLabel;
    private JTextField addNewUserTextField;
    private JLabel deleteUsersLabel;
    private JButton addButton;
    private JButton deleteButton;
    private JPanel namePanel;

    public ManageUsersGUI1() {
        //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());

    }

    private class AddButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String text = addNewUserTextField.getText();
            users.add(new AddUsers(text));

            // Display the charges.
            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();
        }
    }


    public static void main (String[] args) {
        JFrame frame = new JFrame ("AddUsersPanel1");
        frame.setTitle("Manage Users");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add (new ManageUsersGUI1());
        frame.pack();
        frame.setVisible (true);
    }
}

【讨论】:

  • 谢谢!这正是我想要的。现在我唯一的问题是,当我在检查了一些名称后按下删除按钮时,它并没有删除。当我尝试为 DeleteButtonListener 开始私人课程时,它给了我一个错误 ManageUsersGUI1.java:80: error: ManageUsersGUI1.DeleteButtonListener is not abstract and does not override abstract method actionPerformed(ActionEvent) in ActionListener
  • @pyuntae 这似乎是一个新问题。它似乎关心动作监听器的实现。继续创建一个新问题,向其中添加一些示例代码和堆栈跟踪。
  • @pyuntae 我明白你的问题。它有一个简单的答案:ActionListeners 是“不完整”的类,这意味着您必须实现缺少的功能。您收到的错误是抱怨您没有实现这些类,并且没有将该类标记为“不完整”(摘要)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多