Results 1 to 11 of 11
  1. #1
    Jon_Xel is offline Member
    Join Date
    Jul 2010
    Location
    Lima, Peru
    Posts
    6
    Rep Power
    0

    Question questions about events in differents layers

    Hi, i have a question about MouseEven of the MouseMotionListener and MouseListener Interface; I wanna know if i can activate an event of a component in a layer behind another component, I mean, I have a chessboard, that contains an Bidimensional Array of chart class, using JlayeredPane I place chart class in the innermost part of JlayeredPane, and chess piece in the uppermost part of JLayeredPane. So when I drag the chess piece, using mouseDragged, how could do to activate an event (mouseEntered) of chart class that is in a deeper layer?, because this event doesn`t activate when I drag the chess piece; just this event activate when I do this: making invisible the piece that I dragging; and the I make visible again using mouseReleased.

  2. #2
    Norm's Avatar
    Norm is offline Moderator
    Join Date
    Jun 2008
    Location
    Eastern Florida
    Posts
    17,883
    Rep Power
    25

    Default

    how could do to activate an event (mouseEntered) of chart class that is in a deeper layer
    You'll probably have to write your own code to be able to tell deep layers what is happening in the top layer.

  3. #3
    Jon_Xel is offline Member
    Join Date
    Jul 2010
    Location
    Lima, Peru
    Posts
    6
    Rep Power
    0

    Default

    And how could i do ? for implementing an event that can detecte what's happening on top layer...I mean where can i write that code, in JLayeredPane? and if is there an specific method to do that?.

  4. #4
    Norm's Avatar
    Norm is offline Moderator
    Join Date
    Jun 2008
    Location
    Eastern Florida
    Posts
    17,883
    Rep Power
    25

    Default

    Your code would have to know where each of the layers was. The layer that got the mouse events would call your code which would pass the event to any layer that wanted to know about an event on a higher layer.

  5. #5
    Fubarable's Avatar
    Fubarable is offline Moderator
    Join Date
    Jun 2008
    Posts
    19,315
    Blog Entries
    1
    Rep Power
    26

    Default

    You may want to look into using the findComponentAt(Point p) method in the Container class. If your chess grid is held in a JPanel then calling this method on that JPanel and passing in the mouse point obtained from the MouseEvent object will allow you to find the component held by the board panel at that point. I've used it with success in a Chess program that uses JLayeredPane. I'm not done with the program otherwise I'd post some of it.

  6. #6
    Jon_Xel is offline Member
    Join Date
    Jul 2010
    Location
    Lima, Peru
    Posts
    6
    Rep Power
    0

    Default

    Well, where exactly would I have write findComponent?; in the listener of the chess chart , or the listener of chess piece?, because what I'm using is to activate the event MouseEntered where I move the mouse in the chessBoard (this class contains 64 chess chart class that extends JPanel) that returns the component where occurs the event, and with this component, I use the methods that I implement on it; but what i want is that this event also activates when I use MouseDragged on chess piece(that extends JLabe; it's on JlayeredPane's layer number 1 ), so while I'M dragging the piece, the program activate the event also in chess piece, that is in the deepest part of the JLayeredPane's layer number 0.
    Last edited by Jon_Xel; 07-12-2010 at 09:45 PM.

  7. #7
    Norm's Avatar
    Norm is offline Moderator
    Join Date
    Jun 2008
    Location
    Eastern Florida
    Posts
    17,883
    Rep Power
    25

    Default

    Create a new kind of listener and have those pieces of code that are interested in a mouse event in some layer above them register as a listener for the topside mouse event.
    All components that can be on a top layer report to a monitor that there is an event and then the monitor can report to all the listeners for that event.

  8. #8
    Fubarable's Avatar
    Fubarable is offline Moderator
    Join Date
    Jun 2008
    Posts
    19,315
    Blog Entries
    1
    Rep Power
    26

  9. #9
    Fubarable's Avatar
    Fubarable is offline Moderator
    Join Date
    Jun 2008
    Posts
    19,315
    Blog Entries
    1
    Rep Power
    26

    Default

    In a nut shell, this is what I've done and what has worked for me:

    1) A JLayeredPane holds everything and has a MouseAdapter that is added as a MouseListener and MouseMotionListener.

    2) A JPanel, called "board", that uses GridLayout(8, 8) and is the exact size as the JLayeredPane is added to the layered pane's bottom layer, or to be precise, the JLayeredPane.DEFAULT_LAYER.

    3) This JPanel holds 64 other small JPanel squares in the GridLayout (actually the squares extend from JPanel), and each uses GridBagLayout.

    4) The chess pieces are JLabels and are held by the JPanel squares.

    5) In the MouseAdapter mousePressed method, I get the Point, p, that the mouse is located at via e.getPoint (if e is the MouseEvent object passed to the method). I then find out which square holds this point by calling findComponentAt(p) on the board JPanel. I then check to see if this square holds a piece. If so, the piece is removed from the square and added directly to the JLayeredPane's JLayeredPane.DRAG_LAYER.

    6) If a chess piece is held in the JLayeredPane's JLayeredPane.DRAG_LAYER the MouseAdapter's mouseDragged method will control the piece's location.

    7) On mouseRelease, I again find out which square holds the mouse's location or Point by the same technique as above, using findComponentAt(p) and if it is a valid square, I remove the chess piece from the JLayeredPane's JLayeredPane.DRAG_LAYER and place it in the square. If it's off the board or not a valid square, I return the chess piece to the original location.

    Note that if the board JPanel doesn't completely fill the JLayeredPane, then its offset within the JLayeredPane must be used to correct the location Point, p before calling findComponentAt(p) since the MouseAdapter will return Points relative to the JLayeredPane not the board JPanel.

  10. #10
    Fubarable's Avatar
    Fubarable is offline Moderator
    Join Date
    Jun 2008
    Posts
    19,315
    Blog Entries
    1
    Rep Power
    26

    Default

    For example:
    Java Code:
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import javax.swing.*;
    
    public class Chess2 {
       private static void createAndShowUI() {
          JFrame frame = new JFrame("Chess 2");
          frame.getContentPane().add(new Chess2Gui().getMainComponent());
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          java.awt.EventQueue.invokeLater(new Runnable() {
             public void run() {
                createAndShowUI();
             }
          });
       }
    }
    
    class Chess2Gui {
       private static final int RANKS = 8;
       private static final int FILES = 8;
       private static final Color DARK_COLOR = new Color(0, 100, 0);
       private static final Color LIGHT_COLOR = new Color(200, 200, 200);
       private static final Color DARK_PIECE_COLOR = Color.black;
       private static final int SQR_WIDTH = 80;
       private static final int PIECE_WIDTH = 60;
       private static final Dimension SQR_SIZE = new Dimension(SQR_WIDTH, SQR_WIDTH);
       
       private JLayeredPane mainLayeredPane = new JLayeredPane();
       private JPanel board = new JPanel(new GridLayout(RANKS, FILES));
       private JPanelSquare[][] jPanelSquareGrid = new JPanelSquare[RANKS][FILES];
    
       public Chess2Gui() {
          for (int rank = 0; rank < RANKS; rank++) {
             for (int file = 0; file < FILES; file++) {
                Color bkgd = DARK_COLOR;
                if (rank % 2 == file % 2) {
                   bkgd = LIGHT_COLOR;
                } 
                jPanelSquareGrid[rank][file] = new JPanelSquare(rank, file, bkgd);
                jPanelSquareGrid[rank][file].setPreferredSize(SQR_SIZE);
                board.add(jPanelSquareGrid[rank][file]);
             }
          }
          board.setSize(board.getPreferredSize());
          board.setLocation(0, 0);
          mainLayeredPane.add(board, JLayeredPane.DEFAULT_LAYER);
          mainLayeredPane.setPreferredSize(board.getPreferredSize());
          
          ImageIcon icon = new ImageIcon(ImageUtils2.createImage(PIECE_WIDTH, DARK_PIECE_COLOR));
          JLabel chessPiece = new JLabel(icon, SwingConstants.CENTER);
          
          jPanelSquareGrid[1][3].add(chessPiece);
          
          MyMouseAdapter mouseAdapter = new MyMouseAdapter();
          mainLayeredPane.addMouseListener(mouseAdapter);
          mainLayeredPane.addMouseMotionListener(mouseAdapter);
          
       }
    
       public JComponent getMainComponent() {
          return mainLayeredPane;
       }
       
       private class MyMouseAdapter extends MouseAdapter {
          private JLabel piece = null;
          private Point delta = null;
          private int oldRank = -1;
          private int oldFile = -1;
          
          @Override
          public void mousePressed(MouseEvent e) {
             Point p = e.getPoint();
             Component c = board.getComponentAt(p);
             for (int rank = 0; rank < jPanelSquareGrid.length; rank++) {
                for (int file = 0; file < jPanelSquareGrid[rank].length; file++) {
                   if (jPanelSquareGrid[rank][file] == c) {
                      if (jPanelSquareGrid[rank][file].getChessPiece() != null) {
                         
                         // the jPanelSquares are derived from JPanel but have a 
                         // few of their own methods
                         piece = jPanelSquareGrid[rank][file].getChessPiece();
                         jPanelSquareGrid[rank][file].remove(piece);
                         oldRank = rank;
                         oldFile = file;
                         mainLayeredPane.add(piece, JLayeredPane.DRAG_LAYER);
                         int x = p.x - PIECE_WIDTH/2;
                         int y = p.y - PIECE_WIDTH/2;
                         piece.setLocation(x, y);
                         
                         delta = new Point(p.x - x, p.y - y);
                         board.revalidate();
                         mainLayeredPane.repaint();
                         return;
                      }
                   }
                }
             }
             
             oldFile = -1;
             oldRank = -1;
          }
          
          @Override
          public void mouseDragged(MouseEvent e) {
             if (piece != null) {
                Point p = e.getPoint();
                int x = p.x - delta.x;
                int y = p.y - delta.y;
                piece.setLocation(x, y);
                mainLayeredPane.revalidate();
                mainLayeredPane.repaint();
             }
          }
          
          @Override
          public void mouseReleased(MouseEvent e) {
             if (piece != null) {
                JPanelSquare sqr = (JPanelSquare) board.getComponentAt(e.getPoint());
                mainLayeredPane.remove(piece);
                if (sqr == null || !validMove(sqr)) {
                   jPanelSquareGrid[oldRank][oldFile].add(piece);
                } else {
                   sqr.add(piece);
                }
                
                piece = null;
                delta = null;
                
                oldRank = -1;
                oldFile = -1;
                
                board.revalidate();
                mainLayeredPane.repaint();
             }
          }
    
          // just a pawn's moves
          private boolean validMove(JPanelSquare sqr) {
             int rank = sqr.getRank();
             int file = sqr.getFile();
             
             if (file != oldFile) {
                return false;
             }
             if (oldRank == 1 && (rank != 2 && rank != 3)) {
                return false;
             }
             if (oldRank != 1 && rank != oldRank + 1) {
                return false;
             }
             return true;
          }
       }
    }
    
    @SuppressWarnings("serial")
    class JPanelSquare extends JPanel {
       private int rank;
       private int file;
       private JLabel chessPiece = null;
    
       public JPanelSquare(int rank, int file, Color bkgrnd) {
          this.rank = rank;
          this.file = file;
          setBackground(bkgrnd);
          setLayout(new GridBagLayout());
       }
       
       public int getRank() {
          return rank;
       }
       public int getFile() {
          return file;
       }
       
       @Override
       public Component add(Component c) {
          chessPiece = (JLabel)c;
          return super.add(c);
       }
       
       @Override
       public void remove(Component comp) {
          chessPiece = null;
          super.remove(comp);
       }
       
       public JLabel getChessPiece() {
          return chessPiece;
       }
    }
    
    class ImageUtils2 {
    
       public static BufferedImage createImage(int size, Color color) {
          BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
          Graphics2D g2 = img.createGraphics();
          g2.setColor(color);
          g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                   RenderingHints.VALUE_ANTIALIAS_ON);
          g2.fillOval(size/3, 0, size/3, size/3);
          g2.fillOval(size/4, size/4, size/2, 2*size/3);
          g2.fillOval(size/6, 2*size/3, 2*size/3, size/2);
          g2.dispose();
          return img;
       }
       
    }
    Last edited by Fubarable; 07-13-2010 at 02:49 AM.

  11. #11
    Jon_Xel is offline Member
    Join Date
    Jul 2010
    Location
    Lima, Peru
    Posts
    6
    Rep Power
    0

    Default

    Fubarable thank`u so much :) i could adapt some of your code for my purpose, have a nice day!

Similar Threads

  1. typed events vs untyped events.
    By Drun in forum SWT / JFace
    Replies: 0
    Last Post: 11-23-2009, 01:22 PM
  2. Mouse events, are they best or only way to go?
    By dbashby in forum New To Java
    Replies: 2
    Last Post: 04-10-2009, 05:34 PM
  3. Need Help with events
    By Gatts79 in forum AWT / Swing
    Replies: 3
    Last Post: 09-23-2008, 04:18 AM
  4. differents steps??
    By Yel in forum New To Java
    Replies: 5
    Last Post: 01-04-2008, 05:43 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •