Закругленный угол в JTextField и сделать его согласованным с различными PLAF

Здравствуйте, уважаемые пользователи 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);
}


person OMG-1    schedule 18.05.2011    source источник


Ответы (2)


Я думаю, вам следует создать собственную границу для этого. Затем вы можете управлять вставками и рисовать в рамке вместо метода paintComponent() текстового поля.

person camickr    schedule 19.05.2011
comment
Это проще, чем я думал! - person trashgod; 19.05.2011
comment
При использовании границы вы не можете контролировать белый фон внутри JTextField, по крайней мере, насколько мне известно - person OMG-1; 31.05.2011
comment
@ user616693, это делается с помощью textField.setBackground(). - person camickr; 31.05.2011

У меня была такая же проблема, и я обнаружил, что вызов

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

в классе текстового поля все прояснилось. Я думаю, что это не делает фон непрозрачным, даже если вы объявите виджет непрозрачным.

person Alan Hunt    schedule 29.05.2012