mouseListener problems

Hi everyone, I have some problems with my mouseListener. I’m developing a card game and I wanted to draw cards when the deck is clicked. Is it possible? Or do I need to make a mouseListener in my Board class, take the coordinates when the mouse was clicked and compare them to the coordinates of the deck?

Here’s the code of my Board class.


public class Board extends JPanel{
	
	public OrderCardsDeck deck;
	public Image img;
	private JFrame frame;

	public Board(JFrame frame){
		this.frame = frame;
		
		deck = new OrderCardsDeck();
		
		setFocusable(true);
		ImageIcon i = new ImageIcon("images/GtR.jpg");
		img = i.getImage();
		//help();
	}
	
	public void paint(Graphics g){
		int width = frame.getWidth();
		int height = frame.getHeight();
		super.paint(g);
		Graphics2D g2d = (Graphics2D) g;
		
		g2d.drawImage(img, 0, 0, width, height, null);
		g2d.drawImage((Image) deck.getImage(), 307, 231, null);
		g.drawString(""+deck.getCardsAmmount(), 343, 370);
	}
	
	
	//only for help in the construction of the board
	public void help(){
		this.addMouseListener(new MouseListener(){
			@Override
			public void mouseClicked(MouseEvent e) {
				System.out.println(e.getX()+", " + e.getY());	
			}
			@Override
			public void mousePressed(MouseEvent e) {}
			@Override
			public void mouseReleased(MouseEvent e) {}
			@Override
			public void mouseEntered(MouseEvent e) {}
			@Override
			public void mouseExited(MouseEvent e) {}	
		});
	}
}

And my OrderCardsDeck code, the class Deck is extending Components

public class OrderCardsDeck extends Decks{
	
	private int cards_amount = 144;
	private ArrayList<Cards> cards = new ArrayList<Cards>();
	
	public OrderCardsDeck(){
		setImage("images/back_m.jpg");
		this.addMouseListener(new MouseListener(){
			
			@Override
			public void mouseClicked(MouseEvent e) {
				cards_amount--;
				System.out.println(cards_amount);
				repaint();
			}
			public void mousePressed(MouseEvent e) {}
			public void mouseReleased(MouseEvent e) {}
			public void mouseEntered(MouseEvent e) {}
			public void mouseExited(MouseEvent e) {}
		});
	}

	public int getCardsAmmount() {
		return cards_amount;
	}
}

Two problems I can see:

  • Deck isn’t being added to the Component tree (it should be a child of Board), thus it isn’t receiving events.
  • Board is handling the redrawing of Deck; Deck should be doing this in its own paint method.

Ok, thanks. The problem with the mouseListener is solved. But now the problem is the image of the orderCardsDeck it’s not drawn or it’s just invisible.

public class Frame {
	
	static Board board;
	static OrderCardsDeck orderCardsDeck;
	
	public static void main(String[] args){
		JFrame frame = new JFrame("Glory to Rome");
		
		board = new Board();
		board.setFocusTraversalKeysEnabled(true);
		board.img = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Semir\\Pictures\\Glory to Rome\\Na-chwale-Rzymu-_bw42706.jpg");
		frame.getContentPane().add(board, BorderLayout.CENTER);
		board.setLayout(null);
		
		orderCardsDeck = new OrderCardsDeck();
		orderCardsDeck.setBounds(new Rectangle(343, 370, 93, 130));
		orderCardsDeck.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		orderCardsDeck.image = Toolkit.getDefaultToolkit().getImage("C:\\Users\\Semir\\workspace\\GloryToRome\\images\\back_m.jpg");
		orderCardsDeck.setBounds(343, 370, 93, 130);
		board.add(orderCardsDeck);
		
		frame.setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\Semir\\Pictures\\Glory to Rome\\Glory-to-Rome-Na-chwale-Rzymu-_bc23417.jpg"));
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
		
		frame.setMinimumSize(new Dimension(400, 400));
		frame.setLocationRelativeTo(null);
		
		frame.validate();

		frame.setVisible(true);

	}
	
	public void paint(Graphics g){
		orderCardsDeck.paint(g);
		board.paint(g);
	}
	
}

Change:


public void paint(Graphics g){
      orderCardsDeck.paint(g);
      board.paint(g);
   }

To:


public void paint(Graphics g){
      board.paint(g);
      orderCardsDeck.paint(g);
      
   }

Nothing changed.