2009-05-26 68 views
0

我正在JComponents在屏幕上「加蓋」的GUI上工作。換句話說,不顯示實際的組件,而是顯示組件的圖像。這是一張圖表,其中圖形的節點是自定義的Swing組件 - 或者是Swing組件的標記圖像。在JComponent被繪製之前可以使用findComponentAt()工作嗎?

現在我想顯示我的節點中特定組件的工具提示。

爲此,我創建了一個與所顯示的JComponent相同的JComponent,並使用鼠標的x和y值,我詢問findComponentAt()是否爲正確的組件。這不起作用。如果我爲節點重複使用JComponents,如果我嘗試獲取與最後一個繪製的大小不同的節點的工具提示,將會感到困惑。如果我在計算工具提示時爲每個節點創建一個新的JComponent,並創建一個新的JComponent,則新建的初始大小爲0,0。我可以使用getPreferredSize()計算來設置大小,但這仍然不起作用。根JComponent(一個JPanel)具有合適的大小,但它們的孩子都沒有任何大小。

工具提示運算用代碼的樣品:

// Get a component that matches the stamped component 
JComponent nodeComponent = getNodeComponent(); 

// These next two lines get the size right  
nodeComponent.setSize(nodeComponent.getPreferredSize()); 
nodeComponent.revalidate(); 

Component componentTop = nodeComponent.findComponentAt(relativeX, relativeY); 

componentTop回來作爲根的JComponent無論什麼x和y值被通過。

那麼是否有可能讓Swing正確計算JComponents的大小和位置而不實際繪製它們?

回答

0

我自己找到答案。關鍵問題在於Swing不想佈置組件,除非組件具有合適的父組件。所以,我將我的代碼更改爲:

parentComponent.add(nodeComponent); 

    // Set the node's size and validate it so it's laid out properly 
    nodeComponent.setBounds((int)realizer.getX(), (int)realizer.getY(), (int)realizer.getWidth(), (int)realizer.getHeight()); 

    nodeComponent.validate(); 

    // Now we can properly find the child component under our mouse 
    Component componentTop = nodeComponent.findComponentAt(relativeX, relativeY); 

    // Now remove it from the view 
    parentComponent.remove(nodeComponent); 

而且,它就像一個魅力。您應該可以使用類似的過程來查找JLists或JTable(也使用此Renderer模式)中的子組件。

0

您在圖形中顯示了組件的圖像,必須使它們的大小能夠正確繪製。

要找到您的「郵票」,您應該在圖形中向後走(按z順序),並找到鼠標位置落入的第一個圖像。

首選尺寸不起作用,您應該依靠我認爲「郵票」的大小。

+0

問題不在於找到正確的節點。我有這個。問題是獲取節點中的子組件。根據鼠標是否位於標籤或圖像上,我想在同一個節點中使用不同的工具提示。 – 2009-05-27 20:16:11

相關問題