有什么简单的方法可以让我的jinternalframe成为两全其美

当我希望它们充当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);
    

    最佳答案

    DragLabelOnLayeredPane ChessBoard 是使用JLayeredPane的好示例。

    GlassPaneDemo 显示了在玻璃窗格上的拖动。
    JComponent#setComponentPopupMenu()将是添加上下文菜单的一种方式。

    07-27 22:17