Как мне реализовать масштабирование для Jpanel? - PullRequest
0 голосов
/ 03 апреля 2019

Я делаю проект для школы ведьм. Мне нужно смоделировать колонию муравьев, а также показать ее в графическом пользовательском интерфейсе.

Весь проект почти завершен, но я не хочу реализовать функцию масштабированиядля моей jPanel.

Я нашел тему на этом сайте, в основном с тем, что мне нужно. Вот ссылка: Увеличение и уменьшение масштаба внутри панели

Что в этом сделал Танасиспоток - это то, что мне в основном нужно, но я понятия не имею, как реализовать его в своем коде с другими классами.

Я новичок в графическом пользовательском интерфейсе, и мы в основном изучаем и понимаем его, выполняя этот проект так,простите, если ответ очень прост, и я прошу ответ.

Я могу предоставить код для классов Pannel и Window.

Я уже пытался запустить его, не задумываясьчто он будет работать непосредственно на моей jpanel, но это, конечно, не сработало. Также пытался назвать его в моем основном, но это тоже не сработало.Вот мой PaintComponent из моей панели.Я в основном делаю это для всего, что показывает (муравьи, колония, еда).

public void paintComponent(Graphics g){
    int tailletab = this.gri.getTab().length;
    //On récupère le tableau de la Grille
    int[][] gril = this.gri.getTab();
    int taillecarre;
    int xcol = this.colo.getPos().getX();
    int ycol = this.colo.getPos().getY();
    int xsou = this.source.getPos().getX();
    int ysou = this.source.getPos().getY();
    if(tailletab<=50){
      taillecarre = tailletab/4+2;
    }else{
      if(tailletab<60){
        taillecarre = tailletab/5+1;
      }else{
        if(tailletab<70){
          taillecarre = tailletab/7+1;
        }else{
          if(tailletab<80){
            taillecarre = tailletab/8;
          }else{
            if(tailletab<90){
              taillecarre = tailletab/10;
            }else{
              taillecarre = tailletab/13;
            }
          }
        }
      }
    }
    for(int i=0; i<tailletab; i++){
      for(int j=0; j<tailletab; j++){
        if(gril[j][i]==0){
          if(j==xcol && i==ycol){
            g.setColor(new Color(102, 51, 0));
            g.fillRect(xcol*taillecarre, ycol*taillecarre,taillecarre,taillecarre);
            g.setColor(Color.BLACK);
            g.drawRect(xcol*taillecarre, ycol*taillecarre,taillecarre,taillecarre);
          }else{
            if(j==xsou && i==ysou){
              g.setColor(Color.RED);
              g.fillRect(xsou*taillecarre, ysou*taillecarre,taillecarre,taillecarre);
              g.setColor(Color.BLACK);
              g.drawRect(xsou*taillecarre, ysou*taillecarre,taillecarre,taillecarre);
            }else{
              g.setColor(Color.BLACK);
              g.drawRect(j*taillecarre, i*taillecarre, taillecarre, taillecarre);
            }
          }
        }else{
          g.setColor(Color.BLACK);
          g.drawRect(j*taillecarre, i*taillecarre, taillecarre, taillecarre);
          g.fillRect(j*taillecarre, i*taillecarre, taillecarre, taillecarre);
        }
      }
    }
}

1 Ответ

0 голосов
/ 03 апреля 2019

Ответ Андреаса Холстенсона в приведенной вами ссылке лучше, чем у Танасиса, потому что вы не должны переопределять paint, а paintComponent, как вы правильно сделали, и Танасис не перезаписывает преобразование, а пытается быть глупым. умный о не прогрессивное обновление преобразования. Если ты потерял меня, просто забудь этот ответ.

В противном случае выбор: использовать AffineTransform или нет, не имеет значения, так как результат одинаков. Возможно, AffineTransform проще в использовании.

Чтобы ответить на ваш вопрос, поместите дополнительный масштабный / переводной код в верхнюю часть этого метода, и все графические элементы, нарисованные после этого, должны быть увеличены (даже если вы используете g вместо g2).

@Override
protected void paintComponent(Graphics g) { // No need to widen it to public
    Graphics2D g2 = (Graphics2D)g;

    AffineTransform oldTransform = g2.getTransform();
    try {
        float zoom = 0.5f; // shrink
        // Note that transforms are in reverse order
        // because of how matrix multiplications work.
        AffineTransform newTransform = new AffineTransform();
        // 2nd transform: re-center
        newTransform.translate(getWidth()  * (1 - zoom) / 2,
                               getHeight() * (1 - zoom) / 2);
        // 1st transform: zoom (relative to upper-left corner)
        newTransform.scale(zoom, zoom);
        g2.transform(newTransform);

        // Draw here
    } finally {
        // Try-finally is probably not required, but ensures that the transform
        // gets restored even if an exception is thrown during drawing.
        g2.setTransform(oldTransform);
    }
...