2012-03-24 2 views
1

Я пишу приложение сопоставления в Java, используя Swing для пользовательского интерфейса (я включил образец прототипа в конце этого сообщения). Карта реализована с использованием настраиваемого класса MapPanel, который расширяет JPanel. Карта извлекается с сервера как серия изображений 300x300 (плитки), которые нарисованы на MapPanel всякий раз, когда вызывается метод paintMap(). Из-за длины и сложности (несколько классов и т.д.) кода я не могу включить все это здесь, но метод paintMap() в основном работает следующим образом:Многослойные панели в Swing с пользовательской покраской

// Loop for each map tile (image, xPos, yPos) 
getGraphics().drawImage(image, xPos, yPos, 300, 300, null); 

Я хотел бы иметь еще JPanel (содержащий JSlider для управления масштабированием), наложенные поверх панели карты, но у меня возникают трудности с тем, чтобы это работало. Всякий раз, когда я рисую карту, наложенная JPanel исчезает. Если я перекрашу наложенную JPanel в методе paintMap(), она плохо мерцает, когда карта перетаскивается (и, таким образом, перекрашивается непрерывно).

Любые предложения относительно того, как я мог реализовать свой интерфейс без мерцания?

UI prototype

ответ

3
getGraphics().drawImage(image, xPos, yPos, 300, 300, null); // WRONG!! 
  1. Не называйте getGraphics() - вместо того, чтобы переопределить paintComponent(Graphics) в виде JPanel или JComponent и краски, когда просил сделать это.
  2. Используйте this как ImageObserver
+0

Перемещение моего вызова drawImage() к методу paintComponent, похоже, устранило мою проблему - спасибо! – Jonathan

0

This article описывает использование JLayeredPane и абстрактный базовый класс для преувеличивать произвольные эффекты на данном компоненте Swing.

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