2009-11-12 3 views

ответ

7

Я подозреваю, что вы должны были бы подкласс JTextArea и переопределить метод paintComponent(), используя фоновое изображение первого и вызова super.paintComponent() для отображения текста:

public void paintComponent (Graphics g) { 
    g.drawImage(watermark, 0, 0, this); 
    super.paintComponent(g); 
} 

редактировать: как указал camickr , a JTextArea непрозрачен, поэтому ваш подкласс должен будет изменить это, позвонив по телефону setOpaque(false).

+3

Вы также можете использовать альфа-канал, чтобы составить изображение с тем, что будет нарисован супер() – Dmitry

+0

Большинство водяных знаков рисуются над содержанием. Если вы хотите это сделать, сначала вызовите super.paintComponent (g), а затем нарисуйте над ним полупрозрачный водяной знак (или текст). Вы можете выбрать прозрачное изображение или работать с альфа-композитами, чтобы получить эффект прозрачности. Также вы можете использовать плитку водяного знака, а не просто рисовать его в верхнем левом углу. Я предлагаю вам сделать многоразовый контейнер Watermark, который будет рисовать водяной знак над его содержимым, поэтому вы можете вставлять JTextArea (прокрутка водяных знаков с текстом) или JScrolledPane (водяные знаки остаются, текстовые прокрутки) –

1

Я сомневаюсь, что приведенное выше предложение будет работать. JTextArea непрозрачен, поэтому текст будет рисоваться поверх изображения. Поэтому, по крайней мере, вам нужно будет сделать текстовую область непротиворечивой, и тогда вам нужно будет играть с цветами фона в области просмотра и/или scrollpane.

Если вы хотите использовать многоразовое решение, попробуйте создать ImageBorder. Порядок живописи:

а) paintComponent

б) paintBorder

с) paintChildren

Так, если добавить рамку в области текста он будет рисовать поверх текста фиксированное местоположение.

Или, если вы добавите границу в область просмотра, она будет рисоваться ниже текста, это плавающее местоположение.

+0

вы можете просто setOpaque (false), и это решает эту небольшую проблему. – ninesided

1

Вы также можете рассмотреть возможность использования JXLayer, которые могут создавать довольно сложные визуальные эффекты

+0

С помощью Java7 вы получаете доступ к [JLayer] (http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html), который основан на проекте, упомянутом Дмитрием. Также нарушена ссылка [link] (https://java.net/projects/jxlayer/). – predi

Смежные вопросы