【发布时间】:2016-01-04 05:46:08
【问题描述】:
我正在尝试让一些 JLabels 在 JPanel 上相互交换位置,并在按键时使用 GridLayout。
到目前为止:
1. 我只能让他们对鼠标点击做出反应。
2.他们只能与上面和左边交换位置。
注意:
1.如果我设置 movePlayer(1) 它可以工作。并从网格 (8,7) 中切换一个 JLabel,其中包含一个玩家的图像,其中一个 JLabel 和其上方的地板图像。但是我的问题是,当我设置 movePlayer(2) 时,它会给我和索引超出 bouds 异常。
2. 这只是我认为与问题相关的部分代码:
JPanel myCentrePanel = new JPanel();
MapElement[][] myMap = new MapElement[8][7];
public TileSwitching(){
super("TileSwitching");
setSize(400,400);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
myCentrePanel.setLayout(new GridLayout(8,7));
myCentrePanel.setPreferredSize(new Dimension(5,5));
add(myCentrePanel);
loadMap(level1);
drawMap();
myCentrePanel.setFocusable(true);
myCentrePanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
movePlayer(1);
myCentrePanel.removeAll();
drawMap();
myCentrePanel.revalidate();
}
});
myCentrePanel.setBackground(Color.CYAN);
}
public void movePlayer(int dir){
if(dir == 1){
for(int i = 0; i<8; i++){
for(int j= 0; j<7; j++){
if (myMap[i][j].getClass() == wk.getClass()){
myMap[i-1][j] = new Player();
myMap[i][j] = new Floor();
}
else{
myMap[i][j] = myMap[i][j];
}
}}
if(dir == 2){
for(int i = 0; i<8; i++){
for(int j= 0; j<7; j++){
if (myMap[i][j].getClass() == wk.getClass()){
myMap[i+1][j] = new Player();
myMap[i][j] = new Floor();
}
else{
myMap[i][j] = myMap[i][j];
}
}}
}
public static void main(String[] args) {
TileSwitching tl = new TileSwitching();
TileSwitching.setVisible(true);
}
上面代码中没有显示的内容:
1.MapElement 是许多子类的父类(继承)。
2.loadMap() 从字符数组中读出字符(例如 a,b,c...),以使用 MapElement 子类的新实例(例如 new Player(),new Floor(),new Tree())填充数组 myMap。
3.drawMap() 根据类将JLabels 添加到JPanel
我的地图[i][j]
4.(两种方法都使用双 For 循环 iGridLayout(8,7) 。
谢谢你,对糟糕的编码和noobishness感到抱歉,希望这很清楚。随意提出一个更好的方法来移动玩家(JLabel) 到JPanel 和GridLayout。请记住,主要问题是:为什么(dir == 1) 有效而(dir == 2) 无效?!
【问题讨论】:
-
考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将导致更少的混乱和更好的响应