현재 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();
}
}
더 이상 정보/코드가 필요하면 알려 주시기 바랍니다. 이 사이트를 처음 사용하는 경우입니다. 충분한 설명을 제공하지 않으면 미안합니다 ... 고마워!
대단원! 그게 쉽지 ... 너는 그것을 고쳤다. 많은 시간을 절약 해 주셔서 감사합니다! – nothingness