Я использую внешний вид Nimbus.
У меня есть два JCheckBox, и по умолчанию текст черный, когда JCheckBox включен, и серый, когда он отключен. Мое новое требование состоит в том, что программа должна игнорировать включенное состояние JCheckBox и вместо этого быть серой, когда isSelected() имеет значение false, и отображать текст в указанном цвете, когда isSelected() имеет значение true.
Я попытался сделать это:
- Расширение BasicCheckBoxUI
- Переопределение метода paintText
- Копирование содержимого BasicButtonUI.paintText() и изменение поведения
Вызов setUI для рассматриваемых JCheckBoxes с экземпляром моего нового класса пользовательского интерфейса
private static class MyCheckBoxUI extends BasicCheckBoxUI { private Color selectedColor; public MyCheckBoxUI( Color selectedColor ) { this.selectedColor = selectedColor; } @Override protected void paintText( Graphics g, AbstractButton b, Rectangle textRect, String text ) { ButtonModel model = b.getModel(); FontMetrics fm = SwingUtilities2.getFontMetrics(b, g); int mnemonicIndex = b.getDisplayedMnemonicIndex(); if( model.isSelected() ) { /*** paint the text normally */ g.setColor( selectedColor ); SwingUtilities2.drawStringUnderlineCharAt(b, g,text, mnemonicIndex, textRect.x + getTextShiftOffset(), textRect.y + fm.getAscent() + getTextShiftOffset()); } else { /*** paint the text disabled ***/ g.setColor(b.getBackground().brighter()); SwingUtilities2.drawStringUnderlineCharAt(b, g,text, mnemonicIndex, textRect.x, textRect.y + fm.getAscent()); g.setColor(b.getBackground().darker()); SwingUtilities2.drawStringUnderlineCharAt(b, g,text, mnemonicIndex, textRect.x - 1, textRect.y + fm.getAscent() - 1); } } }
В конструкторе моей JPanel у меня есть следующее:
jCheckBox1.setUI( new MyCheckBoxUI( Color.red ) );
jCheckBox2.setUI( new MyCheckBoxUI( Color.black ) );
Похоже, это работает, как и ожидалось, за исключением того, что есть побочный эффект. Теперь флажок не будет отображать галочку в поле, когда он выбран, как раньше (я не ожидал этого, поскольку я только переопределил метод paintText). Что я пропустил?
Кроме того, меня беспокоит использование SwingUtilities2, так как меня предупредили, что это внутренний проприетарный API, который может быть удален в будущем выпуске. Есть лучший способ сделать это?