【问题标题】:adding users to JList in chatroom GUI在聊天室 GUI 中将用户添加到 JList
【发布时间】:2014-12-16 08:32:46
【问题描述】:

我正在尝试使用 java 编写一个简单的聊天室 GUI,包括一个用于显示在线用户的 Jlist。首先,用户选择一个显示名称,以便该名称将显示在 JList 中。 这是代码:

(问题仅在createServer() 方法内部,该方法将 Name 作为参数发送给处理程序构造函数,以便在 JList 中显示它!)

public class GUI{
    private JFrame frame;
    private JButton btnSend, btnConnect;
    private JTextArea txtChat;
    private JTextField fldText, fldName;
    private JList clientList;
    private DefaultListModel listModel;
    private JScrollPane sc, scClients;
    private JPanel jpS2All, jpS2Client, jpS2Text;
    private String Name;

    class handler implements ActionListener, MouseListener{
    private String Name = null;

        void handler(String Name) {
            this.Name = Name;

        }

        @Override
        public void actionPerformed(ActionEvent e) {
            chatroom();
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            fldName.setText("");
            listModel.addElement(Name);
        }
    }

    public void creatServer() {
        frame = new JFrame("login");
        frame.setBounds(50, 50, 300, 200);
        btnConnect = new JButton("connect");
        frame.add(btnConnect, BorderLayout.EAST);
        fldName = new JTextField("enter your name");
        fldName.addMouseListener(new handler());
        Name = fldName.getText();
        btnConnect.addActionListener(new handler(Name));
        frame.add(fldName, BorderLayout.CENTER);

        frame.setVisible(true);
        }


    public void chatroom() {
        frame = new JFrame("online friends");
        frame.setBounds(100, 100, 400, 400);
        jpS2All = new JPanel();
        txtChat = new JTextArea();
        txtChat.setRows(25);
        txtChat.setColumns(25);
        txtChat.setEditable(false);
        sc = new JScrollPane(txtChat);
        jpS2All.add(sc);
        frame.add(jpS2All, BorderLayout.WEST);


        ////////////////////////
        jpS2Text = new JPanel();
        fldText = new JTextField();
        fldText.setColumns(34);
        fldText.setHorizontalAlignment(JTextField.RIGHT);

        jpS2Text.add(fldText);
        frame.add(jpS2Text, BorderLayout.SOUTH);

        /////////
        jpS2Client = new JPanel();

        listModel = new DefaultListModel();
        clientList = new JList(listModel);
        clientList.setFixedCellHeight(14);
        clientList.setFixedCellWidth(100);
        scClients = new JScrollPane(clientList);

        frame.add(jpS2Client.add(scClients), BorderLayout.EAST);
        /////////
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.pack();

    }

}

最后在main方法中:

public class Chat {

    public static void main(String[] args) {
        GUI gui = new GUI();
        gui.creatServer();


    }

}

【问题讨论】:

  • 它没有将名称添加到JList,在这一行出现错误:btnConnect.addActionListener(new handler(Name));它说实际和参数列表的长度不同
  • 当listModel发生变化时,再次调用clientList.setModel(listModel)。
  • 我之前提到的错误呢?我的意思是这个错误:实际和参数列表的长度不同我认为这个错误必须首先解决!

标签: java swing jlist defaultlistmodel


【解决方案1】:

这个:

void handler(String Name) {
    ...

应该是

handler(String Name)  {
    ...

成为构造函数,而不是方法。此外,您创建了一个带有两个不同参数列表的handler:空和字符串。两者都需要一个构造函数。

顺便说一句,如果代码使用通常的 java 命名约定,那么代码会很多更容易理解。现在它们在几个地方倒置了。此外,MouseListener 有更多方法需要实现 - 考虑扩展 MouseAdapter。最后,您应该只在event dispatch thread 中创建和访问swing 组件。

【讨论】:

  • 非常感谢您的帮助,现在该行的错误已解决,但下一行出现相同的错误:btnConnect.addActionListener(new handler());我已经实现了 MouseListener,但为了更容易理解,我没有在此处显示的代码中显示它们!
  • @Masoud 请参阅关于需要两个构造函数的行(如果您实际上打算有一个侦听器,其中Name 是null)。另一个显然是handler() ...。您之前没有收到错误,因为在代码中没有定义构造函数的类获得了无参数默认构造函数。
  • @Masoud 尽管无论如何只有一个构造函数可能会更干净,并在需要的地方显式传递null。这可以清楚地表明您将名称设置为null。
  • 是的,它也解决了这个错误,再次感谢,但是当我运行程序时,这个错误显示在控制台中:线程“AWT-EventQueue-0”中的异常 java.lang.NullPointerException。对不起,如果我的问题很简单!
  • @Masoud 这可能是由很多事情引起的,而 您发布的代码,上面的修复并没有做到这一点,所以它在你的其他部分代码。但是请参阅here 如何调试 NullPointerExceptions。
猜你喜欢
  • 2012-12-15
  • 2017-12-27
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多