2012-10-13 65 views
2

該場景:我有一個UI,其中包含JPanel(稱爲topGrid),並在頂層有JFrame的網格佈局。在topGrid之內,我已經將另一個JPanelmidGrid)與網格佈局放在一起。裏面midGrid,是另一個JPanelbottomGrid),它有一個JLabel,我用圖像填充圖像取決於一個數組以及它們的實例在該數組內。如何讓我的頂級Jpanel將其位置設置爲相對於另一個jpanel網格中的jlabel?

目標:我希望topGrid將其視圖集中在bottomGrid中的特定對象上。 (當玩家圖標移動時,遊戲的網格移動到該圖標的中心位置,當遊戲開始時,它已經爲用戶居中。)

我已經考慮從bottomGrid獲得該點並且試圖通過它到topGrid但似乎並沒有拉正確的信息。我知道找到玩家的唯一途徑是遍歷所有組件並檢查實例。對於topGrid必須執行一次,而對於midGrid,則需要在bottomGrid中找到該玩家。然後傳遞Point數據。然後在適當的JPanel上使用setLocation()減去距中心的距離。

有沒有其他人試過這個,並有一個更有效或優雅的方式去呢?我可以探索哪些其他選項?

感謝您的任何反饋意見。

創建內網格topGridJPanel

public void createTopGrid() 
{ 
    int rows = galaxy.getNumRows(); 
    int columns = galaxy.getNumColumns(); 

    pnlGrid.removeAll(); 
    pnlGrid.setLayout(new GridLayout(rows, columns)); 

    for (int row = 0; row < rows; row++) 
    { 
     for (int col = 0; col < columns; col++) 
     { 
      Position pos = new Position(galaxy, row, col); 
      Sector sector = galaxy.getSector(pos); 
      GalaxySector sectorUI = new GalaxySector(sector); 
      pnlGrid.add(sectorUI); 
     } 
    } 
} 

創建內網格midGridJPanel

public void createOccupantIcons() 
{ 
    pnlGridOccupants.removeAll(); 

    Occupant[] occs = sector.getOccupantsAsArray(); 

    for (Occupant occ : occs) 
    { 
     GalaxyOccupant occupant = new GalaxyOccupant(occ, sector); 
     pnlGridOccupants.add(occupant); 
    } 
} 

midGrid每個乘客,該影像圖標從IconRepString在模型中bottomGrid類'JPanel並添加到JLabel根據需要在FlowLayout

對於目視參考:

image

其中綠色廣場topGridJPanel,紅色方塊是midGridJPanel,黑色廣場是bottomGridJPanel與白色圓圈的JLabel內選手圖像。藍色圓圈代表視口用戶將看到遊戲並且是我希望玩家圖標居中的地方。目前,用戶可以在視口周圍的區域使用非常不雅的按鈕來移動網格。這可能就足夠了,但在遊戲開始時,玩家必須移動網格直到他們可以找到他們的圖標。

+0

一些示例代碼將是很好 – MadProgrammer

+0

1爲更新;它讓我想起了舊的[* AppleTrek *](http://en.wikipedia.org/wiki/Apple_Trek)。 – trashgod

回答

3

您也可以查看JScrollNavigator,檢查here。它可以讓你瀏覽整個世界的縮略圖,在相鄰的滾動窗格中以全尺寸顯示。

image

+0

WOW,這實際上是一個不錯的選擇!我可以看到使用它作爲迷你地圖類型的實現。不幸的是,我已經提交了當前的用戶界面,只需要能夠在包含該玩家的面板上集中游戲的網格就可以完成該程序。 – fakataha

+0

哦,我明白你想要「其他選擇」。請修改您的問題以包含[sscce](http://sscce.org/)和屏幕截圖,以說明您在開發的這個階段允許哪些選項。 – trashgod

+0

+1非常不錯... – MadProgrammer

1

關閉我的頭頂,我想你想要的所有引用存儲在某種模式。

您可以使用此模型根據選擇要求更新視圖。

這允許你集中邏輯用於查找和更新元素,而無需知道或關心出其他UI元素

+0

+1表示鬆耦合。我的第一個想法是讓每個'bottomGrid'元素成爲一個按鈕,其[[Action]](http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html)更新'topGrid',但我們實在沒有足夠的信息來想象這種方法。 – trashgod

相關問題