如何保持 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 之间保持图像的位置和大小不变?
为我的所有 Jlabels JTextArea 等设置通用字体大小
如何设置JTextArea的最大大小,如果等于或大于该大小,则可以添加滑块