以方式设置 JTextField 宽度以包装给定的文本

Posted

技术标签:

【中文标题】以方式设置 JTextField 宽度以包装给定的文本【英文标题】:set a JTextField width in maner to wrap a given text 【发布时间】:2014-04-03 10:35:54 【问题描述】:

我有一个不可编辑和禁用的JtextField,我将在其中放置一个在请求数据库后获得的String,我希望这个JtextField 包装我的所有字符串。

我看到了setColumn()setSize() 方法,但我首先不知道我的String 长度。

非常感谢。

【问题讨论】:

【参考方案1】: JTextFields 只能显示一行文本,句号。 如果您需要一个简单的文本组件来包装文本,请使用 JTextArea。 设置其列和行。 将其放入 JScrollPane 中(如果您觉得文本会超出指定的行数)。 拨打setLineWrap(true)就可以了 拨打setWrapStyleWord(true)就可以了。

编辑 您询问在添加或删除文本时调整 JTextField 的大小。我想您总是可以覆盖 JTextField 的 getPreferredSize() 方法,并根据文本的任何更改重新验证/重新绘制其容器,但这样做确实有风险。

例如:

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

public class VaryingTextFieldSize 
   protected static final int GAP = 5;

   public static void main(String[] args) 
      final JTextField textField = new JTextField(1) 
         @Override
         public Dimension getPreferredSize() 
            Dimension superPref = super.getPreferredSize();
            FontMetrics fontMetrics = getFontMetrics(getFont());
            String text = getText();
            if (text.length() > 0) 
               int width = fontMetrics.charsWidth(text.toCharArray(), 0, text.length()) + GAP;
               return new Dimension(width, superPref.height);
            
            return superPref;
         
      ;
      textField.getDocument().addDocumentListener(new DocumentListener() 
         @Override
         public void removeUpdate(DocumentEvent e) 
            reSize();
         

         @Override
         public void insertUpdate(DocumentEvent e) 
            reSize();
         

         @Override
         public void changedUpdate(DocumentEvent e) 
            reSize();
         

         private void reSize() 
            SwingUtilities.invokeLater(new Runnable() 
               public void run() 
                  Container container = textField.getParent();
                  container.revalidate();
                  container.repaint();
               
            );
         
      );
      JPanel enclosingPanel = new JPanel();
      enclosingPanel.setPreferredSize(new Dimension(300, 100));
      enclosingPanel.add(textField);
      JOptionPane.showMessageDialog(null, enclosingPanel);
   

【讨论】:

我只有一行文字,不是多行文字 @RiadSaadi:是的,但是您的帖子指出您希望多行显示这一行。同样,JTextField 不能这样做,但 JTextArea 可以。您的来电。 也许我没有解释清楚,对不起,但我想要的是例如编辑“hello world”,我的 jtextField 将只是写“Hello world”的宽度,如果我想要写“hello every body of the world”,我的 jtextField 将比第一个案例大,但只是为了包装句子“hello every body of the world”。 @RiadSaadi:所以...您希望 JTextField 在您 键入 文本时调整其大小? 请问这个怎么做?

以上是关于以方式设置 JTextField 宽度以包装给定的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何为 JTextField 设置动态宽度?

如何设置计时器以向 JTextField 显示结果时间?

根据最小尺寸包装小部件,然后拉伸它们以填充可用宽度

以编程方式将 UICollectionViewCell 宽度设置为 UICollectionView 宽度

修改宽度以在引导菜单上包装导航栏 [重复]

如何以编程方式确定如何将较小的盒子装入较大的包装中? [关闭]