我有一个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
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没有在视觉上更新。
答案 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()
。