2013-07-15 8 views
1

현재 Carcassone이라는 게임용 응용 프로그램을 만들려고하고 있지만 MouseAdapters와 함께 JLayeredPane을 사용하는 데 문제가 있습니다.JLayeredPane 및 MouseAdapter 문제

현재 게임 보드 역할을하는 GridLayout이있는 JPanel이 포함 된 JLayeredPane이 있습니다. GridLayout의 각 셀에는 보드에있는 타일을 나타내는 JLabel이 포함 된 JPanel이 들어 있습니다. 빈 타일은 검정색 사각형이있는 JLabel입니다.

사용자가 게임 보드 (마우스 누르기 - 끌기 - 놓기) 주위로 타일을 이동하거나 타일을 회전 (마우스 클릭) 할 수있는 JLayeredPane에 사용자 정의 마우스 어댑터 (TileMouseAdapter)를 추가했습니다. (다음 타일 버튼을 테스트하고 나타나는 타일 주위를 이동하려면 제출 버튼을 클릭 한 후 타일이 유효한 이동 인 경우 더 이상 드래그 할 수 없습니다). 이것은 다음 부분을 추가 할 때까지 완벽하게 작동합니다.

이제 화면 상단의 JLayeredPane에 별도의 JPanel을 추가하고 싶습니다. 이 섹션에는 플레이어가 타일에 놓을 수있는 게임 조각이 있어야합니다. 또한 JPanel에서 게임 조각을 잡고 플레이어가 조각을 타일로 드래그 할 수있게하려고합니다. 그러나이 패널을 만들어 JLayeredPane에 추가하면 이전 섹션의 마우스 어댑터가 더 이상 제대로 작동하지 않습니다. 예를 들어, 타일의 하단 섹션을 클릭하면 더 이상 타일을 클릭하고 있음을 인식하지 못합니다. 각 타일의 위쪽 절반을 클릭하면 타일이 선택됩니다. 또한 타일 바닥을 클릭하면 아래의 타일이 선택됩니다. 즉, 타일을 선택하는 메커니즘이 타일의 절반만큼 위쪽으로 이동하는 것처럼 보인다. 누구든지이 문제/가능한 수정에 대한 설명을 알아낼 수 있습니까? 감사합니다.

아래의 코드는 (makeMeeplePanel는())

다음
 private JLayeredPane makeBoardPanel() { 
    JLayeredPane layeredPane = new JLayeredPane(); 
    layeredPane.setLayout(new BorderLayout()); 
    myBoardPanel = new CarcassoneBoardPanel(layeredPane); 
    layeredPane.add(makeMeeplePanel(), BorderLayout.NORTH, JLayeredPane.DEFAULT_LAYER); 
    layeredPane.add(myBoardPanel, BorderLayout.CENTER, JLayeredPane.DEFAULT_LAYER); 

    TileMouseAdapter tileMouseAdapter = new TileMouseAdapter(layeredPane); 
    //MeepleMouseAdapter meepleMouseAdapter = new MeepleMouseAdapter(layeredPane); 

    layeredPane.addMouseListener(tileMouseAdapter); 
    layeredPane.addMouseMotionListener(tileMouseAdapter); 
    //layeredPane.addMouseListener(meepleMouseAdapter); 
    //layeredPane.addMouseMotionListener(meepleMouseAdapter); 
    return layeredPane; 
} 

내 사용자 나 보드의 JPanel의 (myBoardPanel)뿐만 아니라 게임 조각의 패널을 포함하는의 JLayeredPane를 만드는 데 사용되는 코드

입니다 게임 보드 마우스 어댑터 :

package gui; 
    import java.awt.Component; 
    import java.awt.event.MouseAdapter; 
    import java.awt.event.MouseEvent; 
    import javax.swing.JLayeredPane; 
    import javax.swing.JPanel; 

    import tiles.*; 

    public class TileMouseAdapter extends MouseAdapter { 
private JLayeredPane myLayeredPane; 
private CarcassoneBoardPanel myBoard; 
private Tile dragLabel; 
private JPanel clickedPanel; 


public TileMouseAdapter(JLayeredPane layeredPane) { 
    myLayeredPane = layeredPane; 
    myBoard = (CarcassoneBoardPanel) layeredPane.getComponents()[1]; 
} 

private void reset() { 
    if (dragLabel != null) { 
     myLayeredPane.remove(dragLabel); 
     myLayeredPane.revalidate(); 
     myLayeredPane.repaint(); 
    } 
    dragLabel = null; 
    clickedPanel = null; 
} 

@Override 
public void mouseClicked(MouseEvent event) { 
    clickedPanel = (JPanel) myBoard.getComponentAt(event.getPoint()); 
    if (clickedPanel == null) { 
     reset(); 
     return; 
    } 
    Component[] components = clickedPanel.getComponents(); 
    if (!(components[0] instanceof Tile) || components[0] instanceof EmptyTile || !((Tile) components[0]).isDraggable()) { 
     return; 
    } 

    dragLabel = (Tile) components[0]; 
    dragLabel.rotate(); 
    clickedPanel.revalidate(); 
    clickedPanel.repaint(); 
    reset(); 
} 

@Override 
public void mousePressed(MouseEvent event) { 
    clickedPanel = (JPanel) myBoard.getComponentAt(event.getPoint()); 
    System.out.println(event.getPoint()); 
    if (clickedPanel == null) { 
     reset(); 
     return; 
    } 
    Component[] components = clickedPanel.getComponents(); 
    if (!(components[0] instanceof Tile) || (components[0] instanceof EmptyTile) || !((Tile) components[0]).isDraggable()) { 
     return; 
    } 
    dragLabel = (Tile) components[0]; 
    clickedPanel.remove(dragLabel); 
    clickedPanel.add(new EmptyTile(dragLabel.getRow(), dragLabel.getCol())); 
    clickedPanel.revalidate(); 
    clickedPanel.repaint(); 

    int x = event.getPoint().x - dragLabel.getWidth()/2; 
    int y = event.getPoint().y - dragLabel.getHeight()/2; 
    dragLabel.setLocation(x, y); 
    try { 
     myLayeredPane.add(dragLabel, JLayeredPane.DRAG_LAYER); 
     myLayeredPane.repaint(); 
    } catch (IllegalArgumentException e) { 
     //TODO: deal with this? 
     //gives error for some unknown reason, but doesnt effect anything? ignore...dumb error cus jswing sucks 
    } 
} 

@Override 
public void mouseDragged(MouseEvent event) { 
    if (dragLabel == null) { 
     return; 
    } 
    int x = event.getPoint().x - dragLabel.getWidth()/2; 
    int y = event.getPoint().y - dragLabel.getHeight()/2; 
    dragLabel.setLocation(x, y); 
    myLayeredPane.revalidate(); 
} 

@Override 
public void mouseReleased(MouseEvent event) { 
    //TODO: make sure cannot place tile on already occupied panel... 
    if (dragLabel == null || !dragLabel.isDraggable()) { 
     return; 
    } 
    myLayeredPane.remove(dragLabel); 
    myLayeredPane.revalidate(); 
    myLayeredPane.repaint(); 


    JPanel droppedPanel = (JPanel) myBoard.getComponentAt(event.getPoint()); 
    if (droppedPanel == null) { 
     clickedPanel.removeAll(); 
     clickedPanel.add(dragLabel); 
     clickedPanel.revalidate(); 
     reset(); 
     return; 
    } 

    dragLabel.setPosition(((Tile) droppedPanel.getComponents()[0]).getRow(), ((Tile) droppedPanel.getComponents()[0]).getCol()); 
    droppedPanel.removeAll(); 
    droppedPanel.add(dragLabel); 
    droppedPanel.revalidate(); 
    reset(); 
} 

}

더 이상 정보/코드가 필요하면 알려 주시기 바랍니다. 이 사이트를 처음 사용하는 경우입니다. 충분한 설명을 제공하지 않으면 미안합니다 ... 고마워!

답변

2

귀하의 문제는 여기에 있습니다 :

@Override 
public void mouseClicked(MouseEvent event) { 
    clickedPanel = (JPanel) myBoard.getComponentAt(event.getPoint()); 

event.getPoint() 마우스 리스너가 등록되어있는 귀하의 layeredPanePoint 상대를 반환합니다. myBoard.getComponentAt()은 계층화 된 창의 layeredPane.getComponents()[1]에있는 myBoard 구성 요소에 상대적인 지점에서 구성 요소를 반환합니다.

+0

대단원! 그게 쉽지 ... 너는 그것을 고쳤다. 많은 시간을 절약 해 주셔서 감사합니다! – nothingness