Закругленный угол на JTextField и сделать его последовательным через разные PLAF - PullRequest
1 голос
/ 19 мая 2011

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

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

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

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

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

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

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

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

@ Override
public Insets getInsets ()
{
Insets insets = super.getInsets ();
insets.left + = 10;
возврат вставок;
} @ Переопределение
общедоступные вставки getInsets (Вставки вставок)
{
вернуть вставки;
}
@ Переопределить
public void paintComponent (Graphics g)
{
Graphics2D g2 = Graphics2D) g.create ();
g2.setComposite (AlphaComposite.getInstance (AlphaComposite.SRC_OVER, 0.6f));
RoundRectangle2D.Float r2d = новый RoundRectangle2D.Float (0,0, getWidth (), getHeight (), 10,10);
Paint backgroundBrush = new GradientPaint (0,0, новый цвет (0x383838), 0, getHeight (), новый цвет (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); * * point ()) * 1067 g) (1067);;
}

Ответы [ 2 ]

2 голосов
/ 19 мая 2011

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

0 голосов
/ 29 мая 2012

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

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

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

...