自訂邊框用到的情況也比較少(如果只是為了美觀的話)
如,把刻度做到邊框上是個不錯的選擇
當然如果真的為了美觀,那看看下面的圖片:
這又讓我想起做web時用div布局,寬度自增長時那css寫的真是累,ui ux什麼的是很花時間和心思,哎,不過swing就算了,不美觀而且設計的非常複雜。個人還是比較支援原生態swt,但是如果真決定用swt寫一個產品的話,那其實可以考慮不用java了。要原生態效果,語言選擇就多了。
跑題了,回到邊框。原理基本上就是畫,上下左右 加上 4個角,共8個邊框需要畫。所以畫邊框的時候,需要知道的資訊就是,邊框佔據多大空間 和 組件的寬高
邊框繼承Border介面,此介面共3個方法:
1、擷取邊框寬度資訊
Insets getBorderInsets(Component c);
這個方法返回邊框佔據的空間資訊,分別是上下左右位置
public Insets(int top, int left, int bottom, int right)
2、邊框是否透明
boolean isBorderOpaque();
Opaque是不透明的意思,別搞混了此方法返回邊框是否透明,注意
邊框的空間是要算在組件的高寬中的,比如組件大小是100x100,邊框是10,那麼中間80x80的空間就是組件除去邊框的空間
isBorderOpaque為true就是不透明,那麼此時畫邊框的時候,就需要把中間80x80的空間也畫上某種顏色,否則就是bug。你可以理解為,如果邊框不透明,那麼此時邊框就不僅僅是周圍的10,而是100x100。
3、繪製邊框
void paintBorder(Component c, Graphics g, int x, int y, int width, int height);
這個方法沒什麼好說了,width height是組件的高寬,通過getBorderinsets(c)方法擷取邊框資訊,然後就開始用Graphics慢慢畫吧。話說swing單線程的叫用作業系統底層的paint方法畫介面真的讓人感覺很蛋疼
如果想自訂邊框,那extends AbstractBorder是不錯的選擇