I am working on a program that allows two people to play chess. I created a frame that allows a user to select a piece to promote a pawn to when the reach the 8th rank. The problem is, when I create this frame from my main method, it displays fine, but when I create it from my mouse listener, which is where its supposed to be created, it shows a 2x4 checkered pattern, and im not sure why. To be more clear, it actually displays whatever is behind it when its created, because I experimented with displaying it in different locations. here is a compilable example that displays the bug. just copy and paste the following into Example.java, compile and run. When you run it, the promotion frame should come up correctly the first time. click on a string within it to make it go away. after that, click any square, then click on a square in the top row and it will come up incorrectly and you will see the bug
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class Example extends JFrame { private SquarePanel[][] squares; private Colors colors; public Example () { super(); colors = new Colors(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container con = this.getContentPane(); setSize(800,800); setLocation(0,0); con.setLayout(new GridLayout(8,8)); SquarePanel pane = null; SquarePanel lastpanel = null; squares = new SquarePanel[8][8]; int color = colors.WHITE; for(int i = 7; i >= 0; --i) { if(color == colors.WHITE) color = colors.BLACK; else color = colors.WHITE; for(int j = 0; j <= 7; ++j) { if(color == colors.WHITE) color = colors.BLACK; else color = colors.WHITE; lastpanel = new SquarePanel(color,j,i); pane = lastpanel; con.add(pane); squares[j][i] = pane; } } for(int i = 0; i < 8; ++i) { for(int j = 0; j < 8; ++j) { squares[j][i].setResident("pawn"); //System.out.println(squares[j][i].getResident()); //squares[j][i].repaint(); } } MouseListener listener = new MoveListener(this, squares); for(int i = 0; i < 8; ++i) for(int j = 0; j < 8; ++j) squares[i][j].addMouseListener(listener); setVisible(true); PromotionFrame pf = new PromotionFrame(this, 1); String p = null; while(p == null) { p = pf.getPiece(); } pf.dispose(); } public class SquarePanel extends JPanel { private ImageIcon content; private int x; private int y; private int color; private String resident; private Colors colors; public SquarePanel(int color, int x, int y) { content = null; resident = null; colors = new Colors(); this.color = color; this.x = x; this.y = y; Border blackline = BorderFactory.createLineBorder(Color.black); setBorder(blackline); this.setLayout(new GridBagLayout()); } public void paintComponent(Graphics g) { super.paintComponent(g); int width = getWidth(); int height = getHeight(); if(color == colors.WHITE) g.setColor(Color.white); else g.setColor(Color.green); g.fillRect(0, 0, width, height); g.setColor(Color.black); //System.out.println("here"); } public String getResident() { return resident; } public void setResident(String p) { resident = p; if(p == null) removeAll(); else add(new JLabel(p)); } public int getXCoordinate() { return x; } public int getYCoordinate() { return y; } } private class Colors { public int BLACK = 0; public int WHITE = 1; } public class MoveListener implements MouseListener { private int first_click; private SquarePanel first_source; private JFrame frame; private int turn; private SquarePanel[][] squares; public MoveListener(JFrame f, SquarePanel[][] s) { first_click = 0; this.frame = f; turn = colors.WHITE; squares = s; } /* Empty method definition. */ public void mousePressed(MouseEvent e) { SquarePanel p = (SquarePanel)e.getSource(); ImageIcon content = null; if(first_click == 0) { first_source = p; ++first_click; p.setBorder(BorderFactory.createLineBorder(Color.cyan,4)); } else { first_click = 0; first_source.setBorder(BorderFactory.createLineBorder(Color.black)); //System.out.println(turn == colors.WHITE ? "White" : "Black"); if(p.getResident().equals("pawn") && (p.getYCoordinate() == 7 || p.getYCoordinate() == 0)) { PromotionFrame pframe = new PromotionFrame(frame, colors.WHITE); String piece; do { piece = pframe.getPiece(); } while(piece == null); System.out.println(piece); pframe.dispose(); p.setResident(piece); } } } /* Empty method definition. */ public void mouseReleased(MouseEvent e) { } /* Empty method definition. */ public void mouseEntered(MouseEvent e) { } /* Empty method definition. */ public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } } public class PromotionFrame extends JFrame implements MouseListener { private JFrame master; private String piece; public PromotionFrame(JFrame master, int color) { super(); this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); Container con = this.getContentPane(); setSize(400,200); this.master = master; setLocation(master.getX()+master.getWidth()/2-200,master.getY()+master.getHeight()/2-100); setLocation(0,0); con.setLayout(new GridLayout(1,4)); ImageIcon imgicon1; Image img1; Image newimg; ImageIcon img; ImageLabel label; piece = null; label = new ImageLabel("queen"); label.addMouseListener(this); con.add(label); label = new ImageLabel("rook"); label.addMouseListener(this); con.add(label); label = new ImageLabel("bishop"); label.addMouseListener(this); con.add(label); label = new ImageLabel("knight"); label.addMouseListener(this); con.add(label); this.show(); } public String getPiece() { return piece; } /* Empty method definition. */ public void mousePressed(MouseEvent e) { ImageLabel label = (ImageLabel)e.getSource(); piece = label.getPiece(); } /* Empty method definition. */ public void mouseReleased(MouseEvent e) { } /* Empty method definition. */ public void mouseEntered(MouseEvent e) { } /* Empty method definition. */ public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } private class ImageLabel extends JLabel { private String piece; ImageLabel(String piece) { super(piece); this.piece = piece; } public String getPiece() { return piece; } } } public static void main(String[] args) { new Example(); } }