



Насколько мне известно, нет, если не будет трюка с прозрачными накладками.
Большинство графических приложений, которые я видел (и делал), просто перерисовывали всю панель при каждой перерисовке. Теперь вы можете сделать это один раз в графическом буфере, а затем просто быстро закрасить весь фон, скопировав графический буфер в JPanel. Это должно быть быстрее, чем вызов всех графических примитивов для рисования дороги.
Или, как это делают некоторые 2D-игры, возможно, раскрасьте его один раз и обновите движущиеся части, такие как спрайты: нужно стереть старое место, используемое спрайтами (восстановить там фон), и перерисовать спрайты в новом месте. Таким образом, у вас все еще есть копия дороги в графическом буфере, но вместо того, чтобы каждый раз перерисовывать ее целиком, вы обновляете только некоторые мелкие части. Может быть немного быстрее.
Я не уверен, что вы действительно хотите, чтобы ваша дорога никогда не перекрашивалась - события перерисовки срабатывают (например), когда ваше окно изменяется, или когда оно становится видимым после того, как другое окно препятствует ему. Если ваша панель никогда не перекрашивается, она будет выглядеть необычно.
Насколько я помню, Swing будет запускать только соответствующие события рисования для этих обстоятельств, поэтому вы должны быть в порядке, следуя обычному методу подкласса JPanel с подходящим переопределением:
public class RoadPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// your drawing code here
}
}
Если вы кэшируете свою дорогу в изображение или другой графический формат (чтобы сохранить многократные вычисления отображаемых данных) после того, как нарисовали ее один раз, это может сэкономить вам некоторое время на последующих отрисовках.
Что я делаю, так это устанавливаю логическое значение, указывающее, нужно ли перерисовывать определенную часть. Затем в методе paintComponent() я могу проверить значение и перерисовать определенную вещь или нет.
protected void paintComponent(Graphics g){
super.paintComponent(g);
if (drawRoad) {
drawRoadMethod(g);
}
drawTheRest(g);
}
Вроде как это.
Компонент необходимо перекрашивать каждый раз, когда панель закрывается (т. Е. Минимизация рамки / установка другого окна поверх). Поэтому нарисовать что-то только один раз не получится так, как вы этого хотите. Чтобы части, которые не изменяются, отображались более эффективно, вы можете нарисовать их один раз в «буферное» изображение, а затем просто рисовать этот буфер каждый раз, когда панель или компонент необходимо перерисовывать.
// Field that stores the image so it is always accessible
private Image roadImage = null;
// ...
// ...
// Override paintComponent Method
public void paintComponent(Graphics g){
if (roadImage == null) {
// Create the road image if it doesn't exist
roadImage = createImage(width, height);
// draw the roads to the image
Graphics roadG = roadImage.getGraphics();
// Use roadG like you would any other graphics
// object to draw the roads to an image
} else {
// If the buffer image exists, you just need to draw it.
// Draw the road buffer image
g.drawImage(roadImage, 0, 0, null);
}
// Draw everything else ...
// g.draw...
}