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

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

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

非常感谢。

【问题讨论】:

    标签: java string swing jtextfield


    【解决方案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 在您 键入 文本时调整其大小?
    • 请问这个怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多