Java:Как нарисовать наложение без-прокрутки поверх области просмотра ScrollPane?

Я хотел бы использовать ScrollPane для отображения изображения в его области просмотра, а также иметь сетку (или поле или любой другой тип маркера регистрации/местоположения)] наложение на изображение. Мне нужно, чтобы оверлей оставался фиксированным при прокрутке (, что означает, что изображение перемещается «под» оверлеем). Я буду прокручивать представление в окне просмотра с фиксированной скоростью, чтобы обеспечить плавное движение, а наложение должно обеспечивать ссылку на определенное место в окне просмотра. Концептуально представьте себе большую карту, прокручиваемую в окне просмотра, и окно просмотра, имеющее прямоугольник, который не перемещается (относительно самого окна просмотра), который отмечает область, которую можно увеличить в зависимости от действий пользователя.

Я предполагаю (, но еще не подтвердил ), что реализация ScrollPane эффективно обрабатывает рендеринг View (из резервного хранилища, без необходимости перерисовывать весь View (или даже ViewPort)для каждую новую частичную экспозицию)и поэтому предпочел бы не переопределять метод рисования().

Я посмотрел на LayerPane, и, хотя я еще не освоил его, кажется, что это метод грубой силы. ScrollPane является одним из компонентов SplitPane и будет перемещен/изменен в размере. Я ожидаю, что мне придется вручную поддерживать правильную связь между ViewPort и LayerPane, используя абсолютное позиционирование. Я далек от эксперта в дизайне и реализации графического интерфейса, и я уверен, что упускаю возможности, начиная от очевидных и заканчивая неясными и элегантными, которые знал бы опытный человек.

Я открыт для любых предложений, а не только для пути, по которому я пошел. Должен ли я (могу ли я)добавить JPanel в качестве одного из компонентов в свою панель SplitPane,затем добавить LayerPane к тому, что содержит мою ScrollPane и наложение (другого JPanel)на разные слои LayerPane? Есть ли в ScrollPane функциональность для прямой поддержки этого? Я просмотрел учебные пособия по Java Swing и документацию по API, но еще ничего не видел.

Спасибо.

ОБНОВЛЕНИЕ:

Спасибо за ссылку, трэшбог. Это было намного проще, чем я ожидал. Нет необходимости в компоновке на основе LayerPane, GlassPane, xor-... Я не знаю, почему мне не пришло в голову попробовать переопределить JViewport.paint()для рисования моего наложения -, но с кодом ниже Я подтвердил, что концепция даст мне то, что я ищу. Просто используйте подкласс JViewport, и он делает то, что я хотел (в данном случае накладывая прямоугольник в центре окна просмотра, в то время как изображение прокручивается под ним). Я не эксперт по графическому интерфейсу, а Java API невероятно широк; Я понятия не имею, как вы, ребята, держите все это в голове -, но спасибо!

class MyViewport extends JViewport {
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.BLACK);
        g2.drawRect(getWidth()/4,getHeight()/4,getWidth()/2,getHeight()/2);
    }
}
8
задан ags 10 April 2012 в 19:54
поделиться