JTextArea:限制字符串宽度和行数?

时间:2015-08-26 15:40:09

标签: java swing jtextfield jtextarea word-wrap

用户需要输入要在固定尺寸标签上打印的文本。给定字体,标签具有固定数量的线以及固定宽度(以像素为单位)。如何在此用例中调整JTextArea(或Swing中的其他内容,如果有其他选项)?

  • 最大行数
  • 不超过某个像素宽度的每行字符
  • 对于试图超出最大像素宽度的行,在单词级别从一行到另一行的文本换行

我有一个PlainDocument,它根据字符串的宽度(以像素为单位)限制单行文本的长度,以大写Ws(我的字体中最宽的字符)来衡量:

public class StandardDocument extends PlainDocument {

    /****** VARIABLES **********************************************/
    public boolean upperCase = true;
    private int textLimit;
    private int textWidth;
    private int fieldWidth;
    private JTextField textField = new JTextField();


    /** Get the maximum width of this text field, measured in capital Ws.
     *  @return textWidth - int
     **/
    public int getTextWidth() {
        return textWidth;
    }

    /** Get the maximum width of this text field, measured in pixels.
     *  @return textWidth - int
     **/
    protected int getFieldWidth() {
        return fieldWidth;
    }

    /** Core method for inserting value provided by user after "cleaning" user's value automatically. **/
    public void insertString(int offs, String str, AttributeSet attr) throws BadLocationException {

        if (str == null) { return; }

       // Set field value when value is within character limit of field.
        if (textWidth > 0) {
            int attemptedWidth = textField.getFontMetrics(Constants.defaultFontLabels).stringWidth(getText(0, getLength()) + str);
            if (attemptedWidth > fieldWidth) {
                return;
            }
        }

         // Set value in field.
        super.insertString(offs, str, attr);
    }

    /** Set the maximum text width as a maximum number of capital Ws this field may hold. **/
    public void setTextWidth(int wLimit) {
        if (wLimit >= 0) {
            textWidth = wLimit;
            StringBuffer outputBuffer = new StringBuffer(wLimit);
            for (int i = 0; i < wLimit; i++){
               outputBuffer.append("W");
            }
            fieldWidth = textField.getFontMetrics(Constants.defaultFontLabels).stringWidth(outputBuffer.toString());
        }
    }
}

1 个答案:

答案 0 :(得分:2)

JTextArea支持包装。你可以使用:

打开它
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );

行数会有点困难,因为您不知道新添加的文本是否会导致换行直到文档更新。

因此,当您单击“打印”按钮时,可能需要进行交叉编辑。也许您可以使用Text Utilities类中的getWrappedLines(...)方法。如果包裹的线条大于最大值,则会阻止打印。

或者,也许您会自动将文本插入到文档中。然后检查行数。如果大于最大值,则显示消息,然后立即调用remove(...)方法。