如何保持 JTextArea 的大小不变?

Posted

技术标签:

【中文标题】如何保持 JTextArea 的大小不变?【英文标题】:How To Keep Size Of JTextArea constant? 【发布时间】:2011-01-28 02:39:23 【问题描述】:

我在我的应用程序中使用了一个 JTextArea 对象来处理发送短信。

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

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

【问题讨论】:

【参考方案1】:

听起来你正在使用

创建文本区域
JTextArea textArea = new JTextArea();

使用这种格式时,文本区域没有首选大小,因此它会不断增长。如果你使用:

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

然后文本区域将具有 2 行和(大约)30 列的首选大小。当您输入超过首选宽度时,将出现水平滚动条。或者如果你打开换行,那么文本会换行并出现一个垂直滚动条。

【讨论】:

【参考方案2】:

您需要指定:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

-1,这与控制文本区域的大小无关,只是可以添加到Document中的字符数。此外,用户已经编写了一个 DocumentFilter 来执行此操作,这是限制字符数的首选方法。

以上是关于如何保持 JTextArea 的大小不变?的主要内容,如果未能解决你的问题,请参考以下文章

如何在这些 UIImageViews 之间保持图像的位置和大小不变?

CSS/HTML 使文本相对于图像大小保持不变?

为我的所有 Jlabels JTextArea 等设置通用字体大小

如何设置JTextArea的最大大小,如果等于或大于该大小,则可以添加滑块

CSS DIV绝对定位 后 页面的大小改变 div层位置如何保持不变

CSS DIV绝对定位 后 页面的大小改变 div层位置如何保持不变