2011-05-18 49 views
1

你好,親愛的同胞計算器用戶一致,圓角並使其通過不同PLAFs

我有一個簡單的破解在那裏我得到一個JTextField我早就想圓角。
我發現我能繼承的JTextField和覆蓋paintComponent(Graphics g)

在這方面,我可以編輯如下:

  • 變化從標準的邊框邊境BorderFactory.createEmptyBorder()
  • 將文本字段的外觀從矩形更改爲圓角。
  • 更改文本的偏移量,使其不在圓邊框附近。 (覆蓋getInsets()

現在我有以下問題作鬥爭:

  • 更改選擇大小
  • USER改變PLAF到例如因此,Nimbus在subclassed JTextField上的外觀已被破壞,因此我的意思是Nimbus繪畫例程優於我的。所以我得到了混合Nimbus和我的圓形邊框。

所以在很短,是否有任何的你知道我有多解剖JTextField用的各種問題,上面寫的?

寫是構造setBorder(BorderFactory.createEmptyBorder())setOpaque(false);內使圓角邊框的自定義類的JTextField我的示例代碼:

@覆蓋
公共插圖的getInsets()
{
插圖插圖=超。的getInsets();
insets.left + = 10;
return insets;
} @Override
公共插圖的getInsets(插圖插圖)
{
返回插圖;
}
@Override
公共無效paintComponent(圖形克)
{
的Graphics2D G2 = Graphics2D的)g.create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.6f));
RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0,0,getWidth(),getHeight(),10,10);
Paint backgroundBrush = new GradientPaint(0,0,new Color(0x383838),0,getHeight(),new Color(0xCECECE).darker());
Shape oldClip = g2.getClip();
g2.setPaint(backgroundBrush);
g2.clip(r2d);
g2。fillRect(0,0,的getWidth() - 1,的getHeight() - 1);
g2.setClip(oldClip);
g2.setColor(Color.black);
g2.drawRoundRect(0,0,getWidth() - 1,getHeight() - 1,10,10);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_PURE);
g2.dispose();
super.paintComponent(g);
}

回答

2

我覺得你應該爲此創建一個自定義邊框。然後,您可以控制插頁並在邊框中繪畫,而不是文本字段的paintComponent()方法。

+1

這比[我認爲更容易](http://download.oracle.com/javase/tutorial/uiswing/components/border.html#custom)! – trashgod 2011-05-19 01:58:17

+0

使用邊框時,無法控制JTextField內部的白色背景,至少不是我所知的 – 2011-05-31 13:23:41

+0

@ user616693,這是通過使用textField.setBackground()完成的。 – camickr 2011-05-31 15:09:49

0

我有同樣的問題,並發現該文本字段類調用

setBackground(new Color(0,0,0,0)) 

清除它。我認爲即使您聲明窗口小部件不透明,它也不會使背景不透明。