【问题标题】:addactionListener(this) How do I place this line of code in correctly?addactionListener(this) 如何正确放置这行代码?
【发布时间】:2015-12-07 22:27:24
【问题描述】:

所以我正在设计一个聊天室,在我阅读套接字之前,我需要完成这个 GUI。基本上我主要使用TextDemo 作为我的向导。我喜欢它的显示方式,所以我认为从我的代码开始很容易。在我的代码中,每当我尝试输入时它都会中断:

input.addActionListener(this);

当我注释掉该行时,它又会完美地显示/运行。由于我的错误,看起来我把它放在了错误的位置。我试过移动它一点,但我似乎还没有解决问题的技能来解决这个问题。有人可以帮助纠正我并解释我在这里做错了什么吗?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GUI extends JPanel implements ActionListener
{     
   private final static String newline = "\n";

///// CREATING THE GUI /////
JFrame frame = new JFrame("Chatroom");
JPanel panel = new JPanel();
JPanel panel2 = new JPanel();
JPanel chatpanel = new JPanel();
JPanel inputpanel = new JPanel();
JPanel sendpanel = new JPanel();
JTextArea chat = new JTextArea(19, 49);
JTextArea input = new JTextArea(3, 40);

JScrollPane chatscroll = new JScrollPane(chat,
                                         JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                         JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JScrollPane inputscroll = new JScrollPane(input,
                                         JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                         JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

JButton connectbutton = new JButton("Connect");
JButton disconnectbutton = new JButton("Disconnect");
JButton send = new JButton("Send");
JLabel label = new JLabel();

///// GUI CONSTRUCTOR /////
public GUI()
{
   chatroomGUI();
}

public void chatroomGUI()
{      
   ///// GUI DISPLAY /////
   frame.setVisible(true);
   frame.setSize(800, 450);
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   panel.setBackground(Color.GRAY);
   panel2.setBackground(Color.lightGray);
   chatpanel.setBackground(Color.lightGray);
   inputpanel.setBackground(Color.lightGray);
   sendpanel.setBackground(Color.lightGray);

   ///// ACTION LISTENER /////
   //input.addActionListener(this);

   chat.setEditable(false);
   chat.setFont(new Font("Dialog", Font.PLAIN, 12));
   chat.setLineWrap(true);
   chat.setWrapStyleWord(true);

   input.setFont(new Font("Fialog", Font.PLAIN, 12));
   input.setLineWrap(true);
   input.setWrapStyleWord(true);

   sendpanel.setLayout(new BorderLayout(0, 0));
   sendpanel.setPreferredSize(new Dimension(95, 50));
   chatpanel.setLayout(new FlowLayout());
   chatpanel.setPreferredSize(new Dimension(565, 320));

   ///// ADD AREA /////
   chatpanel.add(chatscroll);
   inputpanel.add(inputscroll);
   inputpanel.add(sendpanel, BorderLayout.EAST);
   sendpanel.add(send, BorderLayout.CENTER);

   panel.add(connectbutton);
   panel.add(disconnectbutton);
   panel.add(label);

   panel2.add(chatpanel);
   panel2.add(inputpanel);

   frame.add(panel, BorderLayout.WEST);
   frame.add(panel2);
}

///// ACTION PERFORMED /////
/*The following will take any text that is typed inside of
the "input" area and display it in the "chat" screen area.*/ 
public void actionPerformed(ActionEvent evt)
{
   String text = input.getText();
   chat.append(text + newline);
   input.selectAll();
   chat.setCaretPosition(chat.getDocument().getLength());
}
}

注意:我的主要在另一个班级。该代码只是看起来像:

public class Chatroom
{
   public static void main(String[] args)
{
   javax.swing.SwingUtilities.invokeLater(new Runnable()
      {
         public void run()
         {
            new GUI();
         }
     });
}
}

【问题讨论】:

    标签: java swing actionlistener jtextarea


    【解决方案1】:

    JTextArea 不支持ActionListener API,因此它没有addActionListener 方法。你应该先咨询JavaDocstutorials

    根据您要执行的操作,您可以考虑使用 DocumentListenerDocumentFilter 或使用键绑定 API,用于 example

    【讨论】:

    • 哦,那一定是对的!我不认为 JTextField 会与 JTextArea 如此不同。非常感谢!我会努力想办法解决这个问题。
    • 看看最后一个链接的例子,它演示了一个自定义 JTextAreaActionListener 支持
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多