2015-08-30 138 views
1

从另一种方法调用它后,GUI出现问题,我正在制作多米诺骨牌游戏。java gui显示不正确

在这里的图片,图形用户界面工作正常,并做它应该做的事情,但是在第二个图像中,我试图使用完全相同的GUI然而它是通过不同的方式解析(我有一个开始屏幕,它将调用该方法并使GUI可见)。 在这里,在控制台中,瓦片存储在分配的阵列中,并且也绘制到GUI

First Image

第二图像在此,playerVSAI方法被称为在从firstScreen()类一个ActionListener。这个类只是左边显示的窗口。然而,控制台,playerVSAI方法似乎按照预期工作,但是瓷砖的图像不显示。

它执行将数据存储到数组,并绘制图块到是同一个,我已经attatched代码的一个片断下面

 if(input2.equalsIgnoreCase("l")) 
    { 

     //add selected input to gameboard 
     gameboardX.add(0,player.get(input1)); 

     JLabel imageTile = new JLabel(new ImageIcon(rotate(bi,rotateDegree))); 

     //place domino image to left, Y direction still the same, only shift X , 
     // shift X by turnCounter, as turnCounter++ larger amount can only shift outwards 
     c.gridy = startingY; 
     c.gridx = startingX - turnCounter ; 

     //add image 
     gui.add(imageTile,c); 
     gui.revalidate(); 
    } 

Second Image

edited

的方法

回答

0

确保你已经调用了setVisible(true);在向GUI添加元素结束时行。

+0

它似乎没有任何区别,如果我有setVisible(true);最后,即使是第一个(只是尝试gui和方法)工作正常。然而,第二个(gui和method + extra GUI)不起作用,当我尝试使用JMenubar调用GUI的新实例和新方法时,也会发生此问题。 – user2058776

+0

你确定这行if(input2.equalsIgnoreCase(“l”))返回true以在if分支内输入吗? –

+0

是的,正如我已经尝试过的,只用GUI和方法,我附加了一个额外的图像,它是带有亮点的图像。第一个亮点是我想玩的瓷砖的位置,第二个亮点是位置(左,右,上,下),所以在这种情况下,L或l,然后将该瓷砖添加到阵列中,以及从src文件中获取选定的图像切片并将其绘制到GUI上(第二部分突出显示) – user2058776

0

这看起来和感觉像是一个线程问题,可能是线程和Swing之间的竞争条件(但是这种情况只会通过从主线程运行setVisible发生)。

确保启动窗口的所有逻辑都从EDT运行,并且没有数据从其他线程传递到Swing对象。最简单的架构是将所有的代码放入EventQueue#invokeLater,稍后你可以转向某种形式的同步(坦率地说,对于一个多米诺骨牌游戏,我不会......),除非你有一个巨大的人工智能运行其中一个玩家)。

+0

对不起,您可以解释如何解释,因为我对此概念不熟悉。 – user2058776

+0

什么概念?线程? – fdreger

+0

使用Swing时(这是基本的信息,实际上是在进行Swing编程时应该学习的第一个信息),您必须使用特殊的指定线程(所谓的EDT)来执行任何接触任何挥杆的工作对象。 – fdreger