Как указал камикр, JTextArea
не дает возможности напрямую изменить высоту линии. Он просто использует высоту шрифта, предоставляемую соответствующим FontMetrics
.
Но это оставляет точку атаки открытой, используя следующий вспомогательный-класс:
public class FontMetricsWrapper extends FontMetrics {
private final FontMetrics target;
public FontMetricsWrapper(FontMetrics target) {
super(target.getFont());
this.target = target;
}
@Override
public int bytesWidth(byte[] data, int off, int len) {
return target.bytesWidth(data, off, len);
}
@Override
public int charWidth(char ch) {
return target.charWidth(ch);
}
@Override
public int charWidth(int codePoint) {
return target.charWidth(codePoint);
}
// ... tons more @Override's, all of the same form:
//
// @Override
// public baz foo(bar, ...) {
// return target.foo(bar, ...);
// }
}
Тогда становится возможным создать JTextArea так:
JTextArea myTextArea = new JTextArea("Some text") {
@Override
public FontMetrics getFontMetrics(Font font) {
return new FontMetricsWrapper(super.getFontMetrics(font)) {
@Override
public int getHeight() {
return 10; // Gives line height in pixels
}
};
}
};
Это, безусловно, не самое чистое решение и просто означает доказательство концепции. Например, одна проблема заключается в том, что getFontMetrics(...)
вызывается довольно часто и в данном примере каждый раз создает новый экземпляр класса-оболочки. Итак, по крайней мере, HashMap, который кэширует созданный FontMetricsWrapper
для каждого заданного шрифта, будет в порядке ...
Но, я действительно надеялся, был способ играть с Font
или, возможно, связанный FontRenderContext
, переданный в JTextArea, чтобы изменить высоту линии. Например, есть ли способ повлиять на данные о восходящем, нисходящем и ведущих значениях шрифта? Кажется странным, что вы можете существенно изменить любой другой аспект внешнего вида шрифта, за исключением этого ...
вам нужно 1. добавить все методы из JTextPane в свой собственный JTextArea, 2. использовать Html и потребовать другие трюки принудительное рендеринг Html в JTextArea правильно – mKorbel
'Немного поиска всегда, кажется, показывает тот же ответ:' - так что же не так с JTextPane? Почему вы пытаетесь изобрести колесо для JTextArea? – camickr
:) Я ожидал этих комментариев ... Иногда мне просто интересно узнать что-то новое и выяснить, что возможно. Существует миллиард опций для этой функции 'deriveFont (...)', включая применение геометрических преобразований на основе матриц и т. Д. Мне просто интересно, можно ли с этим справиться. Это довольно плохо документировано, поэтому некоторые примеры использования были бы хороши. BTW: Что не так с легким кодированием? Зачем переходить на полноэкранную JTextPane, если простой JTextArea может сделать трюк? –