4

Есть ли какой-либо простой способ, чтобы мои jinternalframes быть лучшим из обоих мировJInternalFrames слушать события JDesktopPane

  • внедренные, когда я хочу, чтобы они действовали в рамках JDesktopPane
  • также движимое и способен обрабатывать их собственные события

enter image description here

Надеюсь, эта картина будет помогать. Прямо сейчас у меня есть код для перетаскивания элемента на ваш плеер, и он вставляется в следующий доступный слот для рюкзака, но я также хочу, чтобы его можно было перетащить в любой из слотов рюкзака, но, как вы можете видеть, рисунки ниже. Есть ли быстрый и грязный способ исправить это? На моей панели JDesktopPane есть панель сверху, где все расписано (помимо конечномерных рам, конечно). Извините за весь код и без 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) {} 
}); 

}

EDIT где я возиться с 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); 
+0

Это выглядит так, как будто перетаскивание будет вашим лучшим вариантом здесь. –

+0

имеет смысл ... вы можете уточнить? Я должен признать, что у меня нет опыта перетаскивания кода. возможно, пример или другое сообщение, которое я могу прочитать? спасибо за отзывы уже, кстати. – KisnardOnline

+1

Хотелось бы, чтобы у меня было время написать пример. Это одна из самых сложных функций Swing, по крайней мере для меня, и я расскажу вам об учебниках, а также о том, что вы просматриваете примеры на этом сайте. Это то, что я сделал в прошлом для этого. –

ответ

2

DragLabelOnLayeredPane и ChessBoard являются хорошими примерами, которые используют JLayeredPane.

GlassPaneDemo показывает волочение на стекле.

JComponent#setComponentPopupMenu() был бы способом добавить контекстное меню.

+0

Я попытался использовать концепцию JLayeredPane, и мне не очень повезло ... пока я просто пытаюсь рисовать случайную JLabel над моей игровой картой и не могу заставить ее работать. Я разместил код выше ... любой ключ к разгадке? – KisnardOnline

+0

Я думаю, вам нужно использовать _different_ номера для слоев, и 'я обычно забываю сделать' setBounds() '. –

+0

все должно быть на одном слое для моей игры, за исключением перетаскивания (в данном случае тестирование с помощью jlabel). уровень по умолчанию ниже уровня перетаскивания (который является самым высоким). поэтому setBounds() почему он не работает, вы думаете? – KisnardOnline

2

Чтобы решить эту проблему, я создал JLabel, который я всегда буду обновлять, когда элемент находится в моем состоянии (draggingItem boolean). Вот какой код. Спасибо всем за все помощь и идеи ...

public void mouseDragged(MouseEvent e) { 
    updateMouseCursor(e); 
    if (MapGamePanel.draggingItem){ 
     Point point = e.getPoint(); 
     MapGamePanel.currentX = point.x; 
     MapGamePanel.currentY = point.y; 
     dragJLabel.setBounds(MapGamePanel.currentX, MapGamePanel.currentY, 32, 32); 
    } 
} 

public void mousePressed(MouseEvent e) { 
    MapGamePanel.startX = point.x; 
    MapGamePanel.startY = point.y; 
    dragJLabel = new JLabel(MapGamePanel.draggingItemFilename); 
    dragJLabel.setBounds(MapGamePanel.startX, MapGamePanel.startY, 32, 32); 
    theDesktop.add(dragJLabel, JLayeredPane.DRAG_LAYER); 
} 

То же самое для mouseReleased, я просто удалить JLabel. Кроме того, как вы можете видеть на скриншоте нет изображений еще, только текст, только коды это очень быстро, так что я мог бы предоставить ответ здесь, чтобы помочь другим ...

enter image description here

+0

+1 Выглядит хорошо! Это «TexturePaint» в фоновом режиме? –

+0

hahaha нет, к сожалению, это примерно так же хорошо, как мое художественное мастерство получает ... проверьте мой сайт, если хотите :) www.kisnardonline.com – KisnardOnline