JLabel在Java中的setText之后不会改变

时间:2011-10-13 15:22:40

标签: java jlabel

我有一个JLabel Scoresp1,我希望使用Scoresp1.setText(mijnScore + "");进行更改。但是JLabel上的文字保持不变。

我有一个类Dobbelsteen,看起来像这样:

public class Dobbelsteen extends Spel {

    ...

    public void aantalOgen(int aantalogen) {

        oudepositie = huidigepositie;
        nieuwepositie = (huidigepositie + aantalOgen);
        if (nieuwepositie == eindronde) {
            System.out.println("Speler Piet heeft de ronde gewonnen!");
            updateUI();
        }
    }
}

调用类Spel

中的updateUI
public class Spel {
    ...
   public void updateUI() {
       SwingUtilities.invokeLater(new Runnable() {
           public void run() {  
               ikWin = true;
               while(ikWin){
                   mijnScore = mijnScore+1;
                   Scoresp1.setText(mijnScore + "");
                   System.out.println("mijnScore" + mijnScore);
                   ikWin = false;
                   positie = 0;
                   }
              }

          });
       }
    ...
}

Scoresp1被声明为public JLabel Scoresp1;。如果我使用String l = Scoresp1.getText();我得到了正确的值,但JLabel没有在视觉上更新。

3 个答案:

答案 0 :(得分:2)

我已经看过你们的一些代码了,我的第一个问题(除了过度使用静态变量)就是你不恰当地使用继承而且因为这是在错误的引用上调用方法。

许多类继承自Spel,但似乎不应该这样做。例如,你的Dobbelsteen类继承自Spel,但它还有一个单独的Spel实例 - 为什么?当运行此代码时,Spel对象当前可见什么?我怀疑它是Dobbelsteen延伸的那个。因此,我认为您正在尝试更改Dobbelsteen类所持有的JLabel,但它不是当前可视化的“Spel”对象。要正确更改可视化JLabel,您需要对包含它的当前可视化Spel对象的有效引用,并在该类上调用适当的公共方法。

总而言之,您可能希望从头开始重新编写此项目,目标是从视图(GUI)中分离出您的模型(数据),并着眼于良好的OOP原则。 / p>

修改1:

这可能只是一个绑带,但是如果你在Dobbelsteen的构造函数中将你的Spel引用传递给你,那会怎么样(更改注意到!! comments:// !!):

//!! public class Dobbelsteen extends Spel {
public class Dobbelsteen { //!!

   int dobbelsteen;
   int nieuwepositie;
   int nieuwepositie2;
   public static String newPos;
   public static String newPos2;
   int oudepositie;
   int oudepositie2;
   int huidigepositie = Spel.positie;
   // int huidigepositie2 = Spel.positie2;
   int aantalOgen = Spel.aantalogen;
   int aantalOgen2 = Spel.aantalogen2;
   static boolean heeftgewonnen = false;

   // !! Spel spiel = new Spel();
   Spel spiel; // !!

   // !!
   public Dobbelsteen(Spel spiel) {
      this.spiel = spiel;
   }

   public void aantalOgen(int aantalogen) {
      oudepositie = huidigepositie;
      nieuwepositie = (huidigepositie + aantalOgen);
      if (nieuwepositie == Spel.eindronde) { //!!
         System.out.println("Speler Piet heeft de ronde gewonnen!");
         spiel.updateUI(); //!! ****** here in particular ******
      } else if (nieuwepositie > Spel.eindronde) {
         Spel.positie = huidigepositie; //!!
         spiel.output.setText("Je hebt teveel gegooid"); //!!
         spiel.output.setForeground(Color.red); //!!
      } else {
         Spel.oudpositie = oudepositie; //!!
         Spel.positie = nieuwepositie; //!!
         newPos = String.valueOf(nieuwepositie);
         if (SpelHost.host) {
            SpelHost.verstuurPositie("Positie" + newPos);
         } else if (SpelClient.client) {
            SpelClient.verstuurPositie("Positie" + newPos);
         }
      }

   }
}

并称之为:

class GooiDobbelsteen extends MouseAdapter {

   @Override
   public void mouseClicked(MouseEvent e) {
      aanBeurt = false;
      dobbelsteen = new Random();
      aantalogen = dobbelsteen.nextInt(6) + 1;
      aantalOog = String.valueOf(aantalogen);
      Dobbelsteen dobbel = new Dobbelsteen(Spel.this); // !!
      dobbel.aantalOgen(aantalogen);

答案 1 :(得分:0)

使用      public void updateUI(){        SwingUtilities.invokeLater(new Runnable(){            public void run(){
               ikWin = true;                而(ikWin){                    mijnScore = mijnScore + 1;  SwingUtilities.invokeLater(new Runnable()                 {

                @Override
                public void run()
                {
                    Scoresp1.setText(mijnScore + "");

                }
            });

               System.out.println("mijnScore" + mijnScore);
               ikWin = false;
               positie = 0;
               }
          }

      });
   }

进行测试

答案 2 :(得分:-1)

在while循环的末尾添加Scoresp1.repaint()