Java 如何保持JTextArea的大小不变?

Java 如何保持JTextArea的大小不变?,java,swing,textarea,Java,Swing,Textarea,我在我的应用程序中使用了一个JTextArea对象来处理发送sms的问题 我使用了DocumentFilter,以便在textarea中只允许键入160个字符,但现在,我希望textarea的大小保持不变。如果我不按“回车”键,或者只按“回车”键,而一直在同一行上书写,则会继续增加。我也尝试过使用“滚动条”,但问题依然存在。给我提些建议。下面是我的代码。请检查一下 class Send_sms extends JPanel implements ActionListener,DocumentLi

我在我的应用程序中使用了一个JTextArea对象来处理发送sms的问题

我使用了DocumentFilter,以便在textarea中只允许键入160个字符,但现在,我希望textarea的大小保持不变。如果我不按“回车”键,或者只按“回车”键,而一直在同一行上书写,则会继续增加。我也尝试过使用“滚动条”,但问题依然存在。给我提些建议。下面是我的代码。请检查一下

class Send_sms extends JPanel implements ActionListener,DocumentListener    
{     
    JButton send;  
    JTextArea smst;  
    JLabel title,limit;  
    JPanel mainp,titlep,sendp,wrap,titlewrap,blankp1,blankp2,sendwrap;   
    JScrollPane scroll;  
    Border br,blackbr;  
    Boolean flag = false;  
    PlainDocument plane;
    public static final int LINES = 4;  
    public static final int CHAR_PER_LINE = 40;     
       //character limit 160 for a sms  

    public Send_sms()
        {
        br = BorderFactory.createLineBorder(Color.RED);
        blackbr = BorderFactory.createEtchedBorder(EtchedBorder.RAISED,Color.DARK_GRAY,Color.GRAY);
        setBorder(blackbr);

                title = new JLabel("Enter the text you want to send!");
        title.setFont(new Font("",Font.BOLD,17));
        limit = new JLabel(""+charCount+" Characters");
        smst = new JTextArea(LINES,CHAR_PER_LINE);
        smst.setSize(100,100);
        plane = (PlainDocument)smst.getDocument();
        //adding DocumentSizeFilter 2 keep track of characters entered
        plane.setDocumentFilter(new DocumentSizeFilter(charCount));
        plane.addDocumentListener(this);
        send = new JButton("Send");
        send.setToolTipText("Click Here To Send SMS");
        send.addActionListener(this);

        //scroll = new JScrollPane(smst);
        //scroll.setPreferredSize(new Dimension(200,200));
        //scroll.setVerticalScrollBarPolicy(null);
        //scroll.setHorizontalScrollBarPolicy(null);
        smst.setBorder(br);

        blankp1 = new JPanel();
        blankp2 = new JPanel();
        titlep = new JPanel(new FlowLayout(FlowLayout.CENTER));
        titlewrap = new JPanel(new GridLayout(2,1));
        mainp = new JPanel(new BorderLayout());
        sendwrap = new JPanel(new GridLayout(3,1));
        sendp = new JPanel(new FlowLayout(FlowLayout.CENTER));
        wrap = new JPanel(new BorderLayout());

        titlep.add(title);
        titlewrap.add(titlep);
        titlewrap.add(blankp1);

        sendp.add(send);
        sendwrap.add(limit);
        sendwrap.add(blankp2);
        sendwrap.add(sendp);

        wrap.add(smst,BorderLayout.CENTER); 
        mainp.add(titlewrap,BorderLayout.NORTH);
        mainp.add(wrap,BorderLayout.CENTER);
        mainp.add(sendwrap,BorderLayout.SOUTH);
        add(mainp);


              }

    public void actionPerformed(ActionEvent e)
    {
        Vector<Vector<String>> info = new Vector<Vector<String>> ();
        Vector<String> numbers = new Vector<String>();
        if(e.getSource() == send)
        {
            //Call a function to send he message to all the clients using text
            //charCount = 165;
            String msg = smst.getText();
            if(msg.length() == 0)
                JOptionPane.showMessageDialog(null,"Please Enter Message","Error",JOptionPane.ERROR_MESSAGE);
            else
            {
            //  System.out.println("Message:"+msg);

                Viewdata frame = new Viewdata(msg);

                limit.setText(""+charCount+" Characters");
                charCount = 160;
              } 
        }
    }
    public void insertUpdate(DocumentEvent e)
    {
        System.out.println("The legth:(insert) "+e.getLength());
        for(int i = 0;i<e.getLength(); i++)
        {   
            if(charCount >0)
                charCount--;
            else
                break;
        }
        limit.setText(""+charCount+" Characters");

    }
    public void removeUpdate(DocumentEvent e)
    {
        //System.out.println("The legth(remove): "+e.getLength());
        for(int i = 0;i<e.getLength(); i++)
        {   

            charCount++;

        }
        limit.setText(""+charCount+" Characters");      
    }
    public void changedUpdate(DocumentEvent e)
    {
        //System.out.println("The legth(change): "+e.getLength());

    }   

}//end Send_sms
类发送\u sms扩展JPanel实现ActionListener、DocumentListener
{     
JButton发送;
jtext区域smst;
JLabel标题、限制;
JPanel mainp、titlep、sendp、wrap、titlewrap、blankp1、blankp2、sendwrap;
JScrollPane滚动条;
边界br,blackr;
布尔标志=假;
普通文件平面;
公共静态最终整数行=4;
每行公共静态最终整数字符=40;
//短信息的字符限制为160
公共发送短信()
{
br=BorderFactory.createLineBorder(颜色为红色);
blackr=BorderFactory.create蚀刻边框(蚀刻边框.凸起,颜色.深灰色,颜色.灰色);
新秩序(blackr);
title=newjlabel(“输入要发送的文本!”);
title.setFont(新字体(“,字体粗体,17));
限制=新的JLabel(“+charCount+”个字符”);
smst=新的JTextArea(行,每行字符);
smst.setSize(100100);
平面=(明文)smst.getDocument();
//添加DocumentSizeFilter 2跟踪输入的字符
plane.setDocumentFilter(新DocumentSizeFilter(charCount));
plane.addDocumentListener(此);
发送=新的JButton(“发送”);
send.setToolTipText(“单击此处发送短信”);
send.addActionListener(this);
//滚动=新的JScrollPane(smst);
//scroll.setPreferredSize(新维度(200200));
//scroll.setVerticalScrollBarPolicy(null);
//scroll.setHorizontalScrollBarPolicy(null);
smst.订单(br);
blankp1=新的JPanel();
blankp2=新的JPanel();
titlep=newjpanel(newflowlayout(FlowLayout.CENTER));
titlewrap=新JPanel(新网格布局(2,1));
mainp=newjpanel(newborderlayout());
sendwrap=newjpanel(新网格布局(3,1));
sendp=newjpanel(newflowlayout(FlowLayout.CENTER));
wrap=newjpanel(newborderlayout());
标题添加(标题);
titlewrap.add(titlep);
标题rap.add(空白P1);
sendp.add(发送);
sendwrap.add(限制);
sendwrap.add(blankp2);
sendwrap.add(sendp);
添加(smst、BorderLayout.CENTER);
主地图添加(标题区,边界布局,北面);
mainp.add(换行,BorderLayout.CENTER);
mainp.add(sendwrap,BorderLayout.SOUTH);
添加(mainp);
}
已执行的公共无效操作(操作事件e)
{
向量信息=新向量();
向量数=新向量();
如果(如getSource()==发送)
{
//调用函数以使用文本向所有客户端发送消息
//字符数=165;
字符串msg=smst.getText();
如果(msg.length()==0)
JOptionPane.showMessageDialog(null,“请输入消息”,“错误”,JOptionPane.Error\u消息);
其他的
{
//System.out.println(“消息:+msg”);
Viewdata frame=新Viewdata(消息);
limit.setText(“+charCount+”个字符”);
字符数=160;
} 
}
}
公共作废插入更新(文档事件e)
{
System.out.println(“legth:(insert)”+e.getLength();
对于(int i=0;i0)
charCount--;
其他的
打破
}
limit.setText(“+charCount+”个字符”);
}
公共作废移除更新(文档事件e)
{
//System.out.println(“legth(remove):”+e.getLength();
对于(int i=0;i您需要指定:

textArea.setColumns (160);
textArea.setLineWrap (true);
textArea.setWrapStyleWord (false); //default

但真正的问题是,您允许输入超过160个字符。您需要创建某种验证器,当已写入160个字符时,该验证器将跳过所有输入的字符。

听起来像是在使用

JTextArea textArea = new JTextArea();
使用此格式时,文本区域没有首选大小,因此会不断增大。如果使用:

JTextArea textArea = new JTextArea(2, 30);
JScrollPane scrollPane = new JScrollPane( textArea );

然后文本区域的首选大小为2行和(大致)30列。当您键入的宽度超过首选宽度时,将显示水平滚动条。或者,如果打开换行,则文本将换行并显示垂直滚动条。

使用扩展PlainDocument的文档初始化文本区域,并在insertString方法中将字符限制为160

-1,这与d无关o通过控制文本区域的大小,仅控制可添加到文档中的字符数。此外,用户已经编写了DocumentFilter来完成此操作,这是限制字符数的首选方法。