Рисование на JPanel без перекрашивания фона
У меня есть алгоритм, который отображает красивые фракталы на JPanel. Я хочу, чтобы на фрактальной панели можно было отображать "перекрестие" линии сетки, когда пользователь наводит указатель мыши на панель.
Я добился этого с помощью простого и быстрого метода для рисования на вещах, которые выглядят так (fractal
это имя фрактала JPanel):
@Override
public void mouseMoved(MouseEvent e) {
Graphics g = fractal.getGraphics();
// <problematic part>
// This is computationally expensive to do. It takes a good 0.2 seconds.
// This must be done to clear 'old' crosshairs
fractal.repaint();
// </problematic part>
Color c = fractal.getColourScheme().getGridlineColour();
g.setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), 50));
// Draw crosshairs around the mouse's current point
g.drawLine(e.getX(), 0, e.getX(), fractal.getHeight());
g.drawLine(0, e.getY(), fractal.getWidth(), e.getY());
}
Как показано на рисунке, я должен перекрасить (), чтобы очистить все старые перекрестия.
У меня такое чувство, что мне нужно нарисовать перекрестие на чем-то похожем на стеклянную панель, чтобы она располагалась поверх моей JPanel - однако, JPanel не предоставляет стеклянную панель. Хотя JRootPane - я могу использовать это вместо этого?
PS
В настоящее время я рисую фрактальный пиксель за пикселем с большим количеством маленьких Line2D
s. Я в конечном итоге изменить это на производство BufferedImage
- в каком случае эта проблема будет иметь значение?
1 ответ
Я думаю, что ваша идея использовать стеклянную панель решит вашу проблему навсегда. Больше не имело бы значения, как вы выбираете рисовать сам фрактал, или отображается ли он в JPanel или любом другом типе компонента. Каждый объект должен действительно нести ответственность за свои собственные данные и действия, поэтому другой объект, вероятно, будет хорошим выбором для проектирования.
При этом вам все равно нужно будет перекрасить стекло. Вы должны быть в состоянии использовать public void repaint(long tm, int x,
int y,
int width,
int height)
метод перекрасить только определенные части панели, вместо перекраски целиком.
JavaDoc утверждает:
Добавляет указанную область в список грязных областей, если компонент отображается. Компонент будет перекрашен после отправки всех ожидающих в данный момент событий.