2014-05-14 104 views
0

我想一個邊距設置爲我的JTextField擴展了JTextField,搖擺保證金

因此

我所做的:

class MyJTextField extends JTextField { 

@Override 
public void paint(Graphics g) { 
    System.err.println("paint " + System.currentTimeMillis()); 
    setMargin(new Insets(0, 0, 0, 25)); 
    super.paint(g); 
} 
} 

我的意思是它的工作原理,但我希望塗料在無限循環調用因爲setMargin的JavaDoc說:「...這會導致組件的重繪」。爲什麼我錯了?

+1

爲什麼在塗料中?爲什麼不在構造函數中? –

+0

頁邊距在運行時可能會發生變化(簡化示例) – matthias

+0

您應該採用「推送」模式:根據事件處理函數調用setMargin(),該事件需要重新計算邊距,並依靠自動佈局失效和更新。 paint()方法應該繪製組件,而不改變它;找出合適的保證金規模是完全不合適的。 –

回答

0

這將只會立即重繪。每個下一個setMargin都不做任何事情,因爲類Insets具有自定義方法equals。當您設置兩次相同的對象時,不會發生屬性更改,也不會調用重繪。

+0

但它稱組件無效?!這不會導致重畫嗎? – matthias

+0

我斷言佈局管理器很聰明,也可以確定沒有任何變化,也不需要重新繪製。但你是對的,這有點神祕。 –

0

將此代碼用於邊框。

JTextField textField = new JTextField(); 
Border border = BorderFactory.createLineBorder(Color.BLUE, 1); 
textField.setBorder(border);