Рисование JComponent без добавления его в контейнер - PullRequest
1 голос
/ 15 июня 2011

Я реализовал пользовательский JPanel, метод рисования которого я расширил, чтобы выполнять много ручной визуализации в полноэкранном режиме.Теперь я хотел бы добавить к этому еще один JComponent (в моем случае JPanel, который содержит JScrollpane с JTextPane в качестве области просмотра), который должен отображаться поверх моей первой панели, но потому что мой пользовательский рендерингТрубопровод сложный, добавить JComponent к моей панели и раскрасить его традиционным способом через систему AWT - не вариант (я пробовал, и в лучшем случае он причудливый, в худшем не функциональный), поэтому мой вопрос: возможно ливручную заказать JComponent для рисования в одной точке моей программы, вызвав его обычный метод рисования, не привязывая его к JContainer, и если да, как мне это сделать?

Заранее спасибо заваши ответы.

Ответы [ 5 ]

3 голосов
/ 15 июня 2011

Вы можете взглянуть на CellRendererPane и посмотреть, как, например, BasicTableUI рисует с него изображения компонентов.

3 голосов
/ 15 июня 2011

См. Источник LabelRenderTest.java в этой теме . Метка в конечном итоге выводится на экран, но она отображается до BufferedImage, прежде чем отображаться.

image

Важной строкой источника является ..

textLabel.setSize(textLabel.getPreferredSize());
2 голосов
/ 15 июня 2011

Вы должны установить размер для компонента. Затем, чтобы позиционировать его, используйте translate вашей графики (x, y), чтобы расположить компонент в нужной точке.

2 голосов
/ 15 июня 2011

Да, просто вызовите обычный метод рисования на объекте и передайте объект Graphics, на котором вы хотите его нарисовать.Тем не менее, это будет просто нарисовать его, и звучит так, как будто вы хотите, чтобы он, возможно, прокручивался, а это значит, что вам нужно будет добавить его в свой пользовательский JPanel.В этом случае просто добавьте панель, и вы получите менеджер компоновки, который разместит компонент там, где он вам нужен.

0 голосов
/ 15 июня 2011

если в иерархии есть какой-либо контейнер более высокого уровня, вы можете использовать для этого пару

validate(); repaint(); 

.

если нет, вы можете изменить его размер или границы (например, +1,-1) в конце заставить его перекрасить.

...