Java JPanel在GridBagLayout中的特定磁贴上移动时消失
我有一个Java JPanel在GridBagLayout中的特定磁贴上移动时消失,java,swing,jpanel,layout-manager,gridbaglayout,Java,Swing,Jpanel,Layout Manager,Gridbaglayout,我有一个JLayeredPane和一个GridBagLayout布局,其中另一个JPanel在用户的按键输入上移动 一切正常,面板(称为点)移动正常,但在网格的最后一个平铺(表示右下角)上,它消失了。程序仍然在运行,我可以正常地将点面板移入和移出这个平铺,但它只是不显示在屏幕上 下面是我的代码,用于存放磁贴的网格窗格: public class GridPane extends JLayeredPane { public int rows; public int columns;
JLayeredPane
和一个GridBagLayout
布局,其中另一个JPanel
在用户的按键输入上移动
一切正常,面板(称为点)移动正常,但在网格的最后一个平铺(表示右下角)上,它消失了。程序仍然在运行,我可以正常地将点面板移入和移出这个平铺,但它只是不显示在屏幕上
下面是我的代码,用于存放磁贴的网格窗格
:
public class GridPane extends JLayeredPane {
public int rows;
public int columns;
private List<List<Tile>> tileGrid;
private GridBagConstraints gbc = new GridBagConstraints();
private KeyListener kl = new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
if(dotTile.column < columns-1)
dotTile = tileGrid.get(dotTile.row).get(dotTile.column+1);
break;
case KeyEvent.VK_LEFT:
if(dotTile.column != 0)
dotTile = tileGrid.get(dotTile.row).get(dotTile.column-1);
break;
case KeyEvent.VK_DOWN:
if(dotTile.row < rows-1)
dotTile = tileGrid.get(dotTile.row+1).get(dotTile.column);
break;
case KeyEvent.VK_UP:
if(dotTile.row != 0)
dotTile = tileGrid.get(dotTile.row-1).get(dotTile.column);
break;
}
//moving the dot
remove(dot);
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridx = dotTile.column;
gbc.gridy = dotTile.row;
add(dot, gbc, 1);
revalidate();
repaint();
}
};
private JPanel dot = new JPanel();
public Tile dotTile;
public GridPane(int rows, int columns) {
this.rows = rows;
this.columns = columns;
setLayout(new GridBagLayout());
addKeyListener(kl);
setFocusable(true);
//fill array and JPanel with Tile
tileGrid = new ArrayList<List<Tile>>(rows);
for (int i = 0; i < rows; i++) {
List<Tile> rowList = new ArrayList<Tile>(columns);
for(int j=0; j < columns; j++) {
Tile t = new Tile(randomColor(), i, j);
rowList.add(t);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = j;
gbc.gridy = i;
add(t, gbc, 0);
}
tileGrid.add(rowList);
}
dot.setPreferredSize(new Dimension(20, 20));
dot.setBackground(Color.BLACK);
//set initial position of dot
dotTile = tileGrid.get(rows/2+1/2).get(columns/2+1/2);
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridx = dotTile.column;
gbc.gridy = dotTile.row;
add(dot, gbc, 1);
repaint();
}
private Random r = new Random();
public Color randomColor() {
return new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
}
Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
private Color gradientColor() {
c = c.darker();
return c;
}
}
公共类GridPane扩展了JLayeredPane{
公共int行;
公共int列;
私有列表tileGrid;
私有GridBagConstraints gbc=新的GridBagConstraints();
private KeyListener kl=新的KeyListener(){
@凌驾
public void keyTyped(KeyEvent e){
}
@凌驾
公共无效密钥已释放(密钥事件e){
//TODO自动生成的方法存根
}
@凌驾
按下公共无效键(按键事件e){
开关(如getKeyCode()){
case KeyEvent.VK_RIGHT:
if(dotTile.column
我(可能)会在GridLayout
中使用JLabel
对象的网格,并根据设计用于表示状态的模型,在移动时简单地更改标签的颜色/图标。一般情况下:为了更快地获得更好的帮助,请发布or。不要扩展JLayeredPane。您尚未更改JLayeredPane的任何功能。平铺是您创建的类吗?如果是,请显示代码。