java jdesktoppane 键盘 事件_java – JInternalFrames,用于监听JDesktopPane事件

有没有简单的方法让我的jinternalframes成为两全其美的

>当我希望它们作为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 dropsToDrag = new HashMap ();

Boolean mobPresent = false;

Boolean playerPresent = false;

if (MapGamePanel.entityInfoHashTable.containsKey(globalCoords)){ //no mobs/npcs

mobPresent = true;

}

Iterator> it = MapGamePanel.entityInfoHashTable.entrySet().iterator();

while (it.hasNext()) {

Entry 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> it2 = dropsToDrag.entrySet().iterator();

while (it2.hasNext()) {

Entry 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);

解决方法:

JComponent #setComponentPopupMenu()将是一种添加上下文菜单的方法.

标签:java,jdesktoppane,mouselistener,jinternalframe,jlayeredpane

来源: https://codeday.me/bug/20190625/1285208.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值