2012-06-05 39 views
1

我的問題是,當我創建一個JButton時,在其構造函數中,我使用下面的代碼將它的位置設置爲一些相對座標,比如x = 5和y = 6:JButton和它的位置方法非常奇怪

this.setLocation(new Point(x, y)); 

但我嘗試使用getLocation()方法獲取其位置後,它始終返回0,0。請注意,這種情況發生在我試圖放置在JFrame的網格佈局上的每個JButton中,並且在調試過程中,我也注意到它們的位置正在正確實例化。

有人可以向我解釋爲什麼發生這種情況,如果我能以某種方式解決它?

編輯:

構造(磚類,我做了,延伸的JButton):

public Brick(int posx, int posy) { 
     this.setLocation(new Point(posx, posy)); 
     this.setVisible(true); 
    } 

我讓他們約在100 + 2循環:

for (int row = 0; row < 15; row++) { 
    for (int column = 0; column < 15; column++) { 
    Brick brickie = new Brick(row, column); 
    } 
    } 

但之後,如果我想挑磚並檢查其位置,請執行以下操作:

Point brickLocation = brickie.getLocation(); 

兩個brickLocation.x == 0brickLocation.y == 0

+0

你可以發佈一些更多的代碼?就像你正在談論的構造函數以及你如何獲得位置? – npinti

+1

1)不要設置按鈕的位置。 2)在GUI被打包並顯示之前,不要調用按鈕的位置。 3)爲了更快得到更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

2

當佈局管理器(您的GridLayout)自動分配按鈕位置時,您正嘗試更改按鈕位置。這就是爲什麼你總是得到相同的價值 - 佈局只是覆蓋它。

要能夠手動更改任何組件邊界/位置(包括按鈕) - 必須將「null」設置爲容器的佈局。之後,只需根據需要更改位置/大小/邊界,這會影響組件的位置。

此外,您不需要使用「setVisible(true)」 - 默認情況下,對於所有組件(甚至那些尚未顯示的組件)都是true。

+0

謝謝,我現在明白了! – NlightNFotis

+0

*「您必須將」null「設置爲容器的佈局」​​或者您可以採取另一種完全更好的方法(並正確使用佈局,詳見@​​mKorbel)。 –

+0

@AndrewThompson有些情況下,null佈局可能比其他方法更有用,但我敢打賭,這不是那種情況。是的,通常最好使用現有的佈局(或爲某些特定情況創建自己的佈局)。 –

2

JComponent(s)可以返回其座標的getBounds或getLocation

  • 如果容器是在屏幕上已經可見

  • pack()

+0

可惜OP選擇了會導致更多問題的答案。 :(+1提供正確的答案:) –

+1

@Andrew湯普森感謝,它可能通過覆蓋Insets(一堆代碼),爲什麼打擾已實施和已知的方法 – mKorbel