简体   繁体   中英

Adding/Removing from a JPanel

I am trying to make a basic map where pressing a button moves a character. I am using Netbeans and so far it's going smoothly! Except for trying to remove a JLabel from a JPanel and then add a new JLabel to it.

Here is my full code:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class startMap extends JFrame {

public int locX = 1;
public int locY = 1;
ImageIcon tile = new ImageIcon("src/tile.png");
JLabel tileLabel = new JLabel(tile);
ImageIcon berry = new ImageIcon("src/berry.png");
JLabel berryLabel = new JLabel(berry);
ImageIcon blank = new ImageIcon("src/blank.png");
JLabel blankLabel = new JLabel(blank);
JLabel testL = new JLabel("LOL");
JPanel[][] map = new JPanel[7][7];

public startMap() {
    setBackground(Color.BLACK);
    setFocusable(true);
    keyHandler kh = new keyHandler();
    addKeyListener(kh);
    mapGUI();
}

public void mapGUI() {
    JPanel mainP = new JPanel();
    mainP.setBackground(Color.BLACK);
    mainP.setLayout(new FlowLayout());
    for (int x = 0; x < 7; x++) {
        for (int i = 0; i < 7; i++) {
            map[x][i] = new JPanel();
            System.out.println("1");
            blankLabel = new JLabel(blank);
            map[x][i].setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
            map[x][i].add(blankLabel);
        }
    }
    for (int x = 1; x < 6; x++) {
        for (int i = 1; i < 6; i++) {
            System.out.println("2");
            map[x][i].removeAll();
            revalidate();
            repaint();
            tileLabel = new JLabel(tile);
            map[x][i].add(tileLabel);
            revalidate();
            repaint();
        }
    }
    System.out.println("3");
    map[locX][locY].removeAll();
    revalidate();
    repaint();
    map[locX][locY].add(berryLabel);
    revalidate();
    repaint();
    for (int x = 0; x < 7; x++) {
        for (int i = 0; i < 7; i++) {
            mainP.add(map[x][i]);
        }
    }

    add(mainP);
}

@Override
public void paint(Graphics g) {
    super.paint(g);

}

private class keyHandler extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            locY+=1;
            map[locX][locY].removeAll();
            revalidate();
            repaint();
            map[locX][locY].add(berryLabel);
            revalidate();
            repaint();


        }

    }
}

}

Here is what changes the squares when the user clicks Right.

Here is the KeyAdapter code:

private class keyHandler extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            locY+=1;
            map[locX][locY].removeAll();
            revalidate();
            repaint();
            map[locX][locY].add(berryLabel);
            revalidate();
            repaint();



        }

    }}

NOTE: the system out is just a debugging method I use to check what's being called when.

So when I run it looks like this

Move to the right and revalidate $ repaint:

在此处输入图片说明

Why does the box located in 1,1 go to being gray?

Help figuring out how to make the boxes stay with a white square instead of turning back to gray.

----------------------------SSCCE----------------------------------

Use the full code above and this is the main class:

import javax.swing.*;

public class TestGame extends JFrame {

public static void main(String[] args) {
    startMap sm = new startMap();
    sm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    sm.setVisible(true);
    sm.setSize(380,415);
    sm.setResizable(false);
}
}

Fixed Version:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class startMap extends JFrame {

public int locX = 1;
public int locY = 1;
ImageIcon tile = new ImageIcon("src/tile.png");
JLabel tileLabel = new JLabel(tile);
ImageIcon berry = new ImageIcon("src/berry.png");
JLabel berryLabel = new JLabel(berry);
ImageIcon blank = new ImageIcon("src/blank.png");
JLabel blankLabel = new JLabel(blank);
JLabel testL = new JLabel("LOL");
JPanel[][] map = new JPanel[7][7];

public startMap() {
    setBackground(Color.BLACK);
    setFocusable(true);
    keyHandler kh = new keyHandler();
    addKeyListener(kh);
    mapGUI();
}

public void mapGUI() {
    JPanel mainP = new JPanel();
    mainP.setBackground(Color.BLACK);
    mainP.setLayout(new FlowLayout());
    for (int x = 0; x < 7; x++) {
        for (int i = 0; i < 7; i++) {
            map[x][i] = new JPanel();
            System.out.println("1");
            blankLabel = new JLabel(blank);
            map[x][i].setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
            map[x][i].add(blankLabel);
        }
    }
    for (int x = 1; x < 6; x++) {
        for (int i = 1; i < 6; i++) {
            System.out.println("2");
            map[x][i].removeAll();
            tileLabel = new JLabel(tile);
            map[x][i].add(tileLabel);
            revalidate();
            repaint();
        }
    }
    System.out.println("3");
    map[locX][locY].removeAll();
    map[locX][locY].add(berryLabel);
    revalidate();
    repaint();
    for (int x = 0; x < 7; x++) {
        for (int i = 0; i < 7; i++) {
            mainP.add(map[x][i]);
        }
    }

    add(mainP);
}

@Override
public void paint(Graphics g) {
    super.paint(g);

}

private class keyHandler extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            berryLabel = new JLabel(berry); //THIS
            tileLabel = new JLabel(tile); //And THIS had to be RE initialized idk why.
            map[locX][locY].removeAll();
            map[locX][locY].add(tileLabel);

            locY += 1;
            map[locX][locY].removeAll();
            map[locX][locY].add(berryLabel);
            revalidate();
            repaint();


        }

    }
}

}

Should be called after adding / removing

revalidate();
repaint();

Don't call repaint() from paint()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM