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的任何功能。平铺是您创建的类吗?如果是,请显示代码。