Pergunta

Como posso desenhar algo no JPanel que vai ficar na mesma e não ser redesenhada, eu estou fazendo um programa de simulação de tráfego e quero que o caminho a ser elaborado uma vez, porque isso não vai mudar. Graças

Foi útil?

Solução

Eu não tenho certeza que você realmente deseja que o seu caminho para nunca mais ser repintado - fogo eventos repaint (por exemplo) quando a janela é redimensionada, ou quando se torna visível após outra janela obstruindo-lo. Se o painel não repinta, em seguida, ele vai olhar peculiar.

Tanto quanto me lembro, balanço só irá disparar eventos de pintura adequados para essas circunstâncias, então você deve ser OK seguindo o método usual de subclassificação JPanel com uma substituição adequada:

public class RoadPanel extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // your drawing code here
    }
}

Se você armazenar em cache sua estrada em uma imagem ou outro formato de gráficos (para economizar cálculo dos dados de exibição várias vezes), uma vez tirada uma vez, isso pode poupar algum tempo em pinturas posteriores.

Outras dicas

A meu conhecimento, não, a menos que haja um truque com sobreposições transparentes.

A maioria das aplicações gráficas serra I (e fez) apenas re-desenhar todo o painel em cada repintar. Agora, você pode fazer isso uma vez, em um buffer gráfico, e depois é só pintar o fundo todo de uma vez, rapidamente, copiando o tampão gráfico para o JPanel. Ele deve ser mais rápido do que chamar todos os primitivos gráficos para desenhar a estrada.

Ou, a forma como algumas 2D jogos que, talvez pintá-lo uma vez e atualizar as partes móveis, como sprites: ele precisa apagar o antigo local utilizado pelos sprites (restaurar o fundo lá) e re-desenhar os sprites na novo lugar. Então você ainda tem uma cópia da estrada em um buffer gráfica, mas em vez de re desenho-lo todo de cada vez, você atualiza apenas algumas peças pequenas. Pode ser um pouco mais rápido.

O componente terá de ser redesenhada cada vez que o painel é obscurecida (ie quadro minimizado / outra put janela na parte superior). Portanto desenhar algo apenas uma vez não vai funcionar como você quer que ele. Para fazer as peças que não mudam ser desenhado de forma mais eficiente, você pode atraí-los uma vez para uma imagem de 'tampão', e depois é só desenhar esse tampão de cada vez que o painel ou necessidades componente a ser redesenhado.

// 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...
}

O que eu faço é definir um valor booleano para se ou não uma determinada parte precisa ser redesenhada. Em seguida, no método paintComponent() posso verificar o valor e redesenhar a coisa certa, ou não.

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if (drawRoad) {
        drawRoadMethod(g);
    }
    drawTheRest(g);
}

Um pouco como isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top