Рисование на 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

В настоящее время я рисую фрактальный пиксель за пикселем с большим количеством маленьких Line2Ds. Я в конечном итоге изменить это на производство BufferedImage - в каком случае эта проблема будет иметь значение?

1 ответ

Я думаю, что ваша идея использовать стеклянную панель решит вашу проблему навсегда. Больше не имело бы значения, как вы выбираете рисовать сам фрактал, или отображается ли он в JPanel или любом другом типе компонента. Каждый объект должен действительно нести ответственность за свои собственные данные и действия, поэтому другой объект, вероятно, будет хорошим выбором для проектирования.

При этом вам все равно нужно будет перекрасить стекло. Вы должны быть в состоянии использовать public void repaint(long tm, int x, int y, int width, int height) метод перекрасить только определенные части панели, вместо перекраски целиком.

JavaDoc утверждает:

Добавляет указанную область в список грязных областей, если компонент отображается. Компонент будет перекрашен после отправки всех ожидающих в данный момент событий.

Другие вопросы по тегам