Закругленный угол в JTextField и сделать его согласованным с помощью разных плафонов

#java #swing #user-interface #jtextfield #border

#java #качать #пользовательский интерфейс #jtextfield #граница

Вопрос:

Здравствуйте, дорогие пользователи stackoverflow,

Я получил простой взлом, в котором я получаю давно желаемые закругленные углы на JTextField .
Я обнаружил, что могу создать подкласс JTextField и переопределить paintComponent(Graphics g)

В связи с этим я мог бы отредактировать следующее:

  • измените границу со стандартной границы на BorderFactory.createEmptyBorder() .
  • измените внешний вид текстового поля с прямоугольного на округло-прямоугольный.
  • измените смещение для текста, чтобы оно не было рядом с круглой границей. (переопределить getInsets() )

Сейчас я борюсь со следующими проблемами:

  • Изменение размера выделения
  • Когда ПОЛЬЗОВАТЕЛЬ меняет плаф, например, на Nimbus, то внешний вид subclassed JTextField разрушается, под этим я подразумеваю, что процедуры рисования Nimbus предпочтительнее моих. Таким образом, я получаю сочетание Nimbus и моей закругленной границы.

Итак, вкратце, кто-нибудь из вас знает, как я разбираю JTextField различные проблемы, написанные выше?

Написан мой пример кода для создания закругленных границ в пользовательском классе JTextField внутри конструктора setBorder(BorderFactory.createEmptyBorder()) и setOpaque(false); :

@Переопределить
общедоступные вставки getInsets()
{
Insets insets = super.getInsets();
вставки.осталось = 10;
вернуть вставки;
} @Переопределить
общедоступные вставки getInsets(Вставки insets)
{
вернуть вставки;
}
@Переопределить
общедоступный void paintComponent(Graphics g)
{
Graphics2D g2 = Graphics2D)g.create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.6f));
roundrectangle 2d.Float r2d = новый roundrectangle 2D.Float(0,0,getWidth(),getHeight(), 10,10);
Нарисовать backgroundBrush = новый GradientPaint(0,0, новый цвет (0x383838), 0,getHeight(), новый цвет (0xCECECE).darker());
Сформировать 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 (Визуализирующие штрихи.KEY_ANTIALIZING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(значения визуализации.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_PURE);
g2.dispose();
super.paintComponent(g);
}

Ответ №1:

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

Комментарии:

1. Это проще , чем я думал!

2. При использовании границы вы не можете контролировать белый фон внутри JTextField, по крайней мере, насколько мне известно

3. @user616693, это делается с помощью TextField.setBackground().

Ответ №2:

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

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

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