如何在一个类中编辑JPanel Graphics?

时间:2016-09-28 00:06:27

标签: java swing

所以我试图在JFrame上编程snake并在JPanel上做所有图形化的东西(移动'蛇',随机食物生成等)。我正处于起步阶段,所以我现在要做的就是使用箭头键在我的框架上移动一个黑色方块。 Panel类中的while循环不会因Snake类中的按键而中断,所以有没有办法用我所有其他代码从同一个类编辑JPanel图形?

这是所有代码。底部的我的Panel类遵循我在此处找到的模板。

with
     inputs ( str ) as (
       select 'Lorem ipsum dolor sit amet, consectetur adipiscing elit' from dual union all
       select 'Lorem ipsumdolor sit amet, consectetur adipiscing elit'  from dual union all
       select 'Loremipsumdolorsitametconsedtetur'                       from dual union all
       select 'Lorem ipsumdolorsit amet, consectetur etc.'              from dual union all
       select 'Lorem ipsum dolorsitamet, consectetur adipiscing elit'   from dual union all
       select 'abcdef ghijk lmno'                                       from dual
     ),
     prep ( str, flag, fragment ) as (
       select str, 
              case when length(str) <= 20 or substr(str, 21, 1) = ' ' then 1 end, 
              substr(str, 1, 20)
       from   inputs
     )
select str, 
       case flag when 1 then fragment 
                        else substr(fragment, 1, instr(fragment, ' ', -1) - 1) end
       as new_str
from   prep;

STR                                                     NEW_STR            
------------------------------------------------------- --------------------
Lorem ipsum dolor sit amet, consectetur adipiscing elit Lorem ipsum dolor   
Lorem ipsumdolor sit amet, consectetur adipiscing elit  Lorem ipsumdolor sit
Loremipsumdolorsitametconsedtetur                                           
Lorem ipsumdolorsit amet, consectetur etc.              Lorem ipsumdolorsit 
Lorem ipsum dolorsitamet, consectetur adipiscing elit   Lorem ipsum
abcdef ghijk lmno                                       abcdef ghijk lmno 

1 个答案:

答案 0 :(得分:2)

绘画方法中永远不应该有while(true)循环。这只会导致无限循环,您的GUI将无法响应事件。

相反,你需要为你的蛇类添加方法来移动蛇。因此,当按下其中一个箭头键时,您将更新蛇的起始位置。然后该方法将调用repaint(),当Swing调用paintComponent()方法时,snake将重绘自身。

所以你的绘画代码应该覆盖paintComponent()而不是paint(),你应该调用super.paintComponent(g)作为方法中的第一个语句。

不要打电话给你的自定义班级&#34; Panel&#34;,有一个名称为AWT的班级。使您的班级名称更具描述性。