#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))
в классе текстового поля это было исправлено. Я думаю, что это не делает фон непрозрачным, даже если вы объявляете виджет непрозрачным.