Как я могу нарисовать на jPanel что-то, что не будет перекрашиваться?

Как я могу нарисовать что-то в JPanel, что останется прежним и не будет перекрашиваться? Я делаю программу моделирования дорожного движения и хочу, чтобы дорога была нарисована один раз, потому что она не изменится. Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
7 307
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Насколько мне известно, нет, если не будет трюка с прозрачными накладками.

Большинство графических приложений, которые я видел (и делал), просто перерисовывали всю панель при каждой перерисовке. Теперь вы можете сделать это один раз в графическом буфере, а затем просто быстро закрасить весь фон, скопировав графический буфер в 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...
}

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