PaintComponent方法没有被调用。

3
我是一名有用的助手,可以翻译文本。
我刚开始学习编程,所以如果我的问题很傻,请原谅。我已经尝试了两天以上来解决这个问题,但是在网上找不到答案,所以我需要你的帮助。提前感谢你。
所以,我正在尝试用Java重新创造Parchisi游戏。我想创建一个方法,每当玩家掷骰子并得到数字“5”时,在特定位置放置一个计数器。该计数器具有自己的类,即:
package parchis;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Ficha extends JPanel
{
   public static int x;
   public static int y;
   public Image imagenficha;

  @Override
  public void paintComponent(Graphics g){

  super.paintComponent(g);

  System.out.println("Ejecutándose función de pintura de ficha");
  g.drawImage(imagenficha,x,y,this);
  g.setColor(Color.RED);
  g.fillRect(0,0,20,20);
}

 Ficha(int color, int locx, int locy, int ancho, int alto){

    this.setSize(60,60);
    System.out.println("El color es el "+Servidor.turno); 
    this.setBounds(locx,locy,ancho,alto); 
    x=locx;
    y=locy;
    this.setVisible(true);
} 

通过调用此方法,将检查器放置在JFrame上:

public void pintarficha(){

    Ficha ficha = new Ficha(Servidor.turno,40,40,100,100);
    jframe.getContentPane().add(ficha);
    Refrescar();
}

刷新:

public static void Refrescar(){

   jpanel.add(jlabel);
   jframe.add(jpanel);
  jframe.pack();
}

问题在于,当从方法外部调用pintarficha()方法时(例如,在我的某个类的实例化中),它能正常工作并绘制计数器,但是当我将其放置在任何方法内部时,PaintComponent方法不会被执行,我无法理解为什么。
这里是一个例子:
package parchis;
public class Administradordereglas {

      Administradordereglas(){
        ********** Menu.menu.pintarficha(); ****************
      }

     void juegodebots(int jugador){

         System.out.println("LLAMADA A JUEGO DE BOTS");
         int valoraañadiralasposiciones;
         valoraañadiralasposiciones= Ventanadeordenes.dado.Tiraeldado();  

         if(valoraañadiralasposiciones==5){

            System.out.println("Se ha sacado un 5, procedo a crear una nueva ficha");
         }

         Parchis.servidor.Pasarturno();
     }
}

但是在这里它不起作用:
package parchis;
public class Administradordereglas {

      Administradordereglas(){

      }
     void juegodebots(int jugador) {

         System.out.println("LLAMADA A JUEGO DE BOTS");
         int valoraañadiralasposiciones;
         valoraañadiralasposiciones= Ventanadeordenes.dado.Tiraeldado();  
         if(valoraañadiralasposiciones==5){
             **************This message appears in the console:****************** 
             System.out.println("Se ha sacado un 5, procedo a crear una nueva ficha");

            *****************Menu.menu.pintarficha();*************************
         }
         Parchis.servidor.Pasarturno();
    }
}

感谢您的帮助。

Pasarturno方法中包含了什么?最终需要在Fischa组件上调用repaint()。 - Reimeus
Pasarturno() 函数会将 int 类型的变量 turno 的值增加 1,并在其增加到 4 以上时将其重置为 1。我已经在 PaintComponent 方法的末尾调用了 repaint 方法,但仍然无法正常工作。 - Roberto Gil León
在控制台中,它没有写入“Ejecutándose función de pintura de ficha”,所以我认为问题是paintComponent没有被执行。无论如何,谢谢。 - Roberto Gil León
@RobertoGilLeón:请注意,当您在基类中覆盖超类的方法时,请尊重“封装原则”,即尽可能保持访问限定符相同。paintComponent(...)方法具有protected访问限定符而不是public :-) 尽管如此,还是给这个问题点赞。 - nIcE cOw
1个回答

1
你可以在你的 Refrescar 方法中添加 repaint() 吗?
public void refrescar() {

    jpanel.add(jlabel);
    jframe.add(jpanel);
    jframe.pack();
    jframe.repaint();
}

ficha.repaint() 其实就是真的 :-) - nIcE cOw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接