Здравствуйте, уважаемые пользователи stackoverflow,
У меня есть простой хак, с помощью которого я получаю долгожданные закругленные углы на JTextField
.
Я обнаружил, что могу создать подкласс JTextField и переопределить paintComponent(Graphics g)
В связи с этим я мог бы отредактировать следующее:
- изменить границу со стандартной границы на
BorderFactory.createEmptyBorder()
. - изменить вид текстового поля с прямоугольного на прямоугольный.
- измените смещение для текста, чтобы он не находился рядом с круглой границей. (переопределить
getInsets()
)
Сейчас борюсь со следующими проблемами:
- Изменение размера выделения
- Когда USER меняет plaf, например, на Nimbus, то внешний вид
subclassed JTextField
испорчен, под этим я подразумеваю, что процедуры рисования Nimbus предпочтительнее моих. Так что я получаю смесь Nimbus и моей круглой бордюрной живописи.
Короче говоря, кто-нибудь из вас знает, как я разбираю JTextField
с различными проблемами, написанными выше?
Написан мой пример кода для создания закругленных границ в пользовательском классе JTextField в конструкторах setBorder(BorderFactory.createEmptyBorder())
и setOpaque(false);
:
@Override
public Insets getInsets()
{
Insets insets = super.getInsets();
insets.left += 10;
return insets;
} @Override
public Insets getInsets(Insets insets)
{
return insets;
}
@Override
public void paintComponent(Graphics g)
{
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_ANTIALIA S_ON);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_PURE);
g2.dispose();
super.paintComponent(g);
}