Is there any easy way to have my jinternalframes be the best of both worlds
Hopefully this picture will help out. Right now I have my code to drag the item to your player and it inserts into next available backpack slot, but I also want to be able to drag it to any of the backpack slots, but as you can see it paints below. Is there any quick and dirty way to remedy this? My JDesktopPane has a panel on top that is where everything is painted to(besides the jinternalframes of course). Sorry for all of the code and no SSCCEE. Just felt it would better to show my logic.
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) {}
});
}
EDIT where I mess around with JLayeredPane due to the suggestions.
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);
DragLabelOnLayeredPane
and ChessBoard
are good examples that use JLayeredPane
.
GlassPaneDemo
shows dragging on the glass pane.
JComponent#setComponentPopupMenu()
would be a way to add a context menu.