有沒有簡單的方法來有我jinternalframes是兩全其美JInternalFrames聽的JDesktopPane事件
- 嵌入式的時候我希望他們充當的JDesktopPane的一部分
- 還可以移動,並且能夠處理自己的事件
希望這幅畫將助陣。現在我有我的代碼將項目拖動到您的播放器,並將其插入到下一個可用的揹包插槽中,但我也希望能夠將其拖到任何揹包插槽中,但是您可以在下面看到它。有沒有任何快速和骯髒的方法來解決這個問題?我的JDesktopPane在頂部有一個面板,這是一切都被繪製到的地方(當然除了jinternalframes)。對不起,所有的代碼和沒有SSCCEE。只是覺得最好能展現我的邏輯。
theDesktop.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
updateMouseCursor(e);
if (MapGamePanel.draggingItem){
Point point = e.getPoint();
MapGamePanel.currentX = point.x;
MapGamePanel.currentY = point.y;
}
}
@Override
public void mouseMoved(MouseEvent e) {
updateMouseCursor(e);
}
});
theDesktop.addMouseListener(new MouseListener() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1){ //left
int whiteLeftSpace = (theDesktop.getWidth() - xTiles*32)/2;
boolean inGamePanel = e.getX() > whiteLeftSpace && e.getX() < (xTiles*32 + whiteLeftSpace) && e.getY() < yTiles*32;
String globalCoords = localToGlobalCoords((e.getX()-whiteLeftSpace)/32 + "," + e.getY()/32);
if (inGamePanel){
//looking for tiles with no mobs or players and loot
String[] globalCoordsSplit = globalCoords.split(",");
int globalX = Integer.parseInt(globalCoordsSplit[0]);
int globalY = Integer.parseInt(globalCoordsSplit[1]);
if ((!(globalX == characterX && globalY == characterY)) && //not under character
((globalX-1) == characterX || globalX == characterX || (globalX+1) == characterX) && //(+/-) 1 xTile
((globalY-1) == characterY || globalY == characterY || (globalY+1) == characterY)){ //(+/-) 1 yTile
HashMap <String, String> dropsToDrag = new HashMap <String, String>();
Boolean mobPresent = false;
Boolean playerPresent = false;
if (MapGamePanel.entityInfoHashTable.containsKey(globalCoords)){ //no mobs/npcs
mobPresent = true;
}
Iterator<Entry<String, String>> it = MapGamePanel.entityInfoHashTable.entrySet().iterator();
while (it.hasNext()) {
Entry<String, String> pairs = it.next();
String key = pairs.getKey();
if (!key.contains(",") && !key.contains("-")){
String[] values = pairs.getValue().split("\\|");
String tempCoords = values[0];
if (globalCoords.equals(tempCoords)){ //player on spot
playerPresent = true;
}
} else if (key.contains("-")){
String[] splitKey = key.split("-");
if (splitKey[0].equals(globalCoords)){
dropsToDrag.put(key, pairs.getValue());
}
}
}
int smallEntityId = Integer.MAX_VALUE; //2147483647
if (!mobPresent && !playerPresent && !dropsToDrag.isEmpty()){
Iterator<Entry<String, String>> it2 = dropsToDrag.entrySet().iterator();
while (it2.hasNext()) {
Entry<String, String> pairs = it2.next();
String[] keyWithPK = pairs.getKey().split("-");
String tmpCoords = keyWithPK[0];
String[] coordsSplit = tmpCoords.split(",");
int tempX = Integer.parseInt(coordsSplit[0]);
int tempY = Integer.parseInt(coordsSplit[1]);
int tmpEntityId = Integer.parseInt(keyWithPK[1]);
String[] values = pairs.getValue().split("\\|");
String tmpId = values[0];
int tmploot_amt = Integer.parseInt(values[1]);
String tmploot_filename = values[2];
if (tmpEntityId < smallEntityId){
smallEntityId = tmpEntityId;
MapGamePanel.dragItemXCoord = tempX;
MapGamePanel.dragItemYCoord = tempY;
MapGamePanel.dragItemEntityId = tmpEntityId;
MapGamePanel.dragItemId = tmpId;
MapGamePanel.dragItemAmt = tmploot_amt;
MapGamePanel.draggingItemFilename = tmploot_filename;
}
}
MapGamePanel.draggingItem = true;
Point point = e.getPoint();
MapGamePanel.startX = point.x;
MapGamePanel.startY = point.y;
}
}
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3){ //right
movementBitKeys.keyReleased(87);
movementBitKeys.keyReleased(68);
movementBitKeys.keyReleased(83);
movementBitKeys.keyReleased(65);
mouseHeld = false;
}
if (MapGamePanel.draggingItem){
int whiteLeftSpace = (theDesktop.getWidth() - xTiles*32)/2;
String[] globalCoords = localToGlobalCoords((MapGamePanel.currentX-whiteLeftSpace)/32 + "," + MapGamePanel.currentY/32).split(",");
int globalX = Integer.parseInt(globalCoords[0]);
int globalY = Integer.parseInt(globalCoords[1]);
String[] startCoords = localToGlobalCoords((MapGamePanel.startX-whiteLeftSpace)/32 + "," + MapGamePanel.startY/32).split(",");
int startX = Integer.parseInt(startCoords[0]);
int startY = Integer.parseInt(startCoords[1]);
if (globalX == characterX && globalY == characterY){
sendToServer("pickupItem|" + startX + "," + startY + "-" + MapGamePanel.dragItemEntityId + "|backpack|-1|" + MapGamePanel.dragItemAmt);
} else if (((globalX-1) == characterX || globalX == characterX || (globalX+1) == characterX) &&
((globalY-1) == characterY || globalY == characterY || (globalY+1) == characterY)){
if (!(startX == globalX && startY == globalY)){
sendToServer("moveItem|" + startX + "," + startY + "-" + MapGamePanel.dragItemEntityId + "|ground|" + globalX + "," + globalY + "|-1|" + MapGamePanel.dragItemAmt);
}
}
MapGamePanel.draggingItem = false;
}
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
});
}
編輯在那裏與周圍的JLayeredPane我惹由於建議。
public static JFrame frame;
public static JLayeredPane theDesktop;
public static MapGamePanel gamePanel; //where all my game tiles draw
....//lines removed
theDesktop = new JDesktopPane();
theDesktop.setOpaque(false);
theDesktop.add(backpackFrame, JLayeredPane.DEFAULT_LAYER);
theDesktop.add(gamePanel, JLayeredPane.DEFAULT_LAYER);
theDesktop.add(new JLabel("THIS SHOULD SHOW UP ABOVE THE OTHER CRAP, but does not"), JLayeredPane.DRAG_LAYER);
....//lots of lines removed
frame.getContentPane().add(theDesktop);
看起來好像拖放將是你最好的選擇。 – 2013-03-27 03:01:39
有意義...你能詳細說明一下嗎?我不得不承認我沒有使用拖放代碼的經驗。可能是我可能讀過的一個示例或另一篇文章?感謝您的反饋,順便說一句。 – KisnardOnline 2013-03-27 03:03:51
我希望我有時間寫一個例子。這是Swing更復雜的功能之一,至少對我而言,我會向您推薦教程,並且還會在本網站上搜索示例。這就是我過去爲此所做的。 – 2013-03-27 03:09:14