用户需要输入要在固定尺寸标签上打印的文本。给定字体,标签具有固定数量的线以及固定宽度(以像素为单位)。如何在此用例中调整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());
}
}
}
答案 0 :(得分:2)
JTextArea支持包装。你可以使用:
打开它textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
行数会有点困难,因为您不知道新添加的文本是否会导致换行直到文档更新。
因此,当您单击“打印”按钮时,可能需要进行交叉编辑。也许您可以使用Text Utilities类中的getWrappedLines(...)
方法。如果包裹的线条大于最大值,则会阻止打印。
或者,也许您会自动将文本插入到文档中。然后检查行数。如果大于最大值,则显示消息,然后立即调用remove(...)
方法。